因为题目并没有给出自己认识自己的数据,所以需要手动从每一个学生向他的床上连一条边,找这个错误找了一个小时。
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
时间: 2024-10-09 13:25:37