Scx117
只一眼,便辽阔了时间。

题意:给你一些人可以睡某某人的床,问是否有所有人都睡下的方案?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 }
posted on 2018-04-23 10:06  Scx117  阅读(134)  评论(0编辑  收藏  举报