0分求助!

P2055 [ZJOI2009] 假期的宿舍

参考题解 ```cpp #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAX=100; const int MAXL=10000; struct Line { int v,next; }e[MAXL]; int h[MAX],cnt=0,tot; int T,n; int home[MAX]; int school[MAX],a,sum; inline void Add(int u,int v) { e[cnt]=(Line){v,h[u]}; h[u]=cnt++; } int match[MAX]; bool vis[MAX]; bool DFS(int x) { for(int i=h[x];i!=-1;i=e[i].next) { int v=e[i].v; if(!vis[v]) { vis[v]=true; if(!match[v]||DFS(match[v])) { match[v]=x; return true; } } } return false; } int main() { cin>>T; while(T--) { cnt=tot=0; memset(h,-1,sizeof(h)); cin>>n; for(int i=1;i<=n;++i) cin>>school[i]; for(int i=1;i<=n;++i) { cin>>home[i]; if(home[i]==0&&school[i])//如果此人是在校学生并且不回家 Add(i,i);//可以睡自己的床 } for(int i=1;i<=n;++i)//统计要床的人 if(!school[i]||(school[i]&&!home[i])) ++tot; for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { cin>>a; if(a&&school[j])//如果i认识j并且j是学生 Add(i,j);//i可以睡j的床 } } memset(match,0,sizeof(match)); sum=0; for(int i=1;i<=n;++i) { if((school[i]&&home[i]==0)||!school[i])//要么是学生在学校,要么是外来的人 { memset(vis,0,sizeof(vis)); if(DFS(i))++sum; } } if(sum==tot) cout<<"^_^"<<endl; else cout<<"T_T"<<endl; } return 0; } ``` 感觉除了建图就没区别啊 而且我把题解的建图改成邻接矩阵其他都不变 居然也是爆蛋... ```cpp #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> using namespace std; const int MAX=100; const int MAXL=10000; int maps[MAX][MAX]; int h[MAX],cnt=0,tot; int T,n; int home[MAX]; int school[MAX],a,sum; inline void Add(int u,int v) { maps[u][v]=true; } int match[MAX]; bool vis[MAX]; bool DFS(int x) { for(int y=1;y<=n;y++) if(maps[x][y]&&!vis[y]) { vis[y]=true; if(!match[y]||DFS(match[y])) { match[y]=x; return true; } } return false; } int main() { cin>>T; while(T--) { cnt=tot=0; memset(h,-1,sizeof(h)); cin>>n; for(int i=1;i<=n;++i) cin>>school[i]; for(int i=1;i<=n;++i) { cin>>home[i]; if(home[i]==0&&school[i])//如果此人是在校学生并且不回家 Add(i,i);//可以睡自己的床 } for(int i=1;i<=n;++i)//统计要床的人 if(!school[i]||(school[i]&&!home[i])) ++tot; for(int i=1;i<=n;++i) { for(int j=1;j<=n;++j) { cin>>a; if(a&&school[j])//如果i认识j并且j是学生 Add(i,j);//i可以睡j的床 } } memset(match,0,sizeof(match)); sum=0; for(int i=1;i<=n;++i) { if((school[i]&&home[i]==0)||!school[i])//要么是学生在学校,要么是外来的人 { memset(vis,0,sizeof(vis)); if(DFS(i))++sum; } } if(sum==tot) cout<<"^_^"<<endl; else cout<<"T_T"<<endl; } return 0; } ```
by NewSjf @ 2019-10-04 00:07:52


@[NewSjf](/space/show?uid=229609) [这里](https://www.cnblogs.com/qqq1112/p/11332850.html)
by Strong_Jelly @ 2019-10-04 08:15:19


@[神兵qqq1112](/space/show?uid=143681) 哈哈哈偶遇大佬
by CHUAN02162 @ 2019-10-07 00:22:36


@[川川川川川](/space/show?uid=128961) emm
by Strong_Jelly @ 2019-10-07 07:57:31


|