题意:给你一些人可以睡某某人的床,问是否有所有人都睡下的方案?n<=50。
二分图最大匹配。
用邻接矩阵比较舒服。
标程:
1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 int read() 5 { 6 int x=0;char ch=getchar(); 7 while (ch<'0'||ch>'9') ch=getchar(); 8 while ('0'<=ch&&ch<='9') x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); 9 return x; 10 } 11 const int N=55; 12 int vis[N],tot,ans,n,st[N],gh[N],match[N],x,g[N][N]; 13 int find(int x) 14 { 15 for (int i=1;i<=n;i++) 16 if (!vis[i]&&g[x][i]) 17 { 18 vis[i]=1; 19 if (!match[i]||find(match[i])) {match[i]=x;return 1;} 20 } 21 return 0; 22 } 23 int main() 24 { 25 int T=read(); 26 while (T--) 27 { 28 n=read();tot=0;memset(g,0,sizeof(g)); 29 for (int i=1;i<=n;i++) st[i]=read(); 30 for (int i=1;i<=n;i++) gh[i]=read(); 31 for (int i=1;i<=n;i++) if (st[i]&&!gh[i]) g[i][i]=1; 32 for (int i=1;i<=n;i++) if (st[i]&&!gh[i]||!st[i]) tot++; 33 for (int i=1;i<=n;i++) 34 for (int j=1;j<=n;j++) 35 if (read()) 36 if (!(st[i]&&gh[i])&&st[j]) g[i][j]=1; 37 memset(match,0,sizeof(match));ans=0; 38 for (int i=1;i<=n;i++) 39 { 40 memset(vis,0,sizeof(vis)); 41 if (find(i)) ans++; 42 } 43 puts(tot==ans?"^_^":"T_T"); 44 } 45 return 0; 46 }