1. 程式人生 > >假期的宿舍——二分圖模板一個

假期的宿舍——二分圖模板一個

style play close 技術分享 vector namespace ios cli tdi

  因為題目並沒有給出自己認識自己的數據,所以需要手動從每一個學生向他的床上連一條邊,找這個錯誤找了一個小時。

技術分享
 1 #include<algorithm>
 2 #include<iostream>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<vector>
 6 using namespace std;
 7 const int N=77;
 8 int n,p,beds,res,bed[N],mx[N],my[N];
 9 bool st[N],gone[N],gr[N][N],vis[N];
10 11 bool dfs(int x){ 12 for(int i=1;i<=beds;i++) 13 if(gr[x][i]&&!vis[i]){ 14 vis[i]=true; 15 if(my[i]==0||dfs(my[i])){ 16 mx[x]=i; 17 my[i]=x; 18 return true; 19 } 20 } 21 return
false; 22 } 23 24 int main(){ 25 int T;cin>>T; 26 while(T--){ 27 memset(st,0,sizeof st);memset(gone,0,sizeof gone);memset(gr,0,sizeof gr); 28 memset(bed,0,sizeof bed);memset(mx,0,sizeof mx);memset(my,0,sizeof my); 29 cin>>n; 30 beds=res=0;p=n;
31 for(int i=1;i<=n;i++){ 32 cin>>st[i]; 33 if(st[i])bed[i]=++beds; 34 } 35 for(int i=1;i<=n;i++){ 36 cin>>gone[i]; 37 if(gone[i]==1&&st[i])p--; 38 else gone[i]=0; 39 } 40 41 for(int i=1;i<=n;i++){ 42 if(st[i])gr[i][bed[i]]=true; 43 for(int j=1;j<=n;j++){ 44 bool x;cin>>x; 45 if(x){ 46 if(st[j])gr[i][bed[j]]=true; 47 if(st[i])gr[j][bed[i]]=true; 48 } 49 } 50 } 51 52 for(int i=1;i<=n;i++) 53 if(!(gone[i]&&st[i])&&mx[i]==0){ 54 memset(vis,0,sizeof vis); 55 res+=dfs(i); 56 } 57 58 cout<<(res>=p?"^_^":"T_T")<<endl; 59 } 60 return 0; 61 }
Method_01

  洛谷 AJAX 32ms

假期的宿舍——二分圖模板一個