BZOJ 1059 [ZJOI2007]矩阵游戏 二分图匹配

二分图匹配。

如果i行j列是1,则i向j连边。如果这个二分图能够完全匹配了,则有解,反之无解。

 

View Code
 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 
 7 #define N 222
 8 #define M 55555
 9 
10 using namespace std;
11 
12 int head[N],next[M],to[M];
13 int cnt,n,linky[N];
14 bool vis[N];
15 
16 inline void add(int u,int v)
17 {
18     to[cnt]=v; next[cnt]=head[u]; head[u]=cnt++;
19 }
20 
21 inline void read()
22 {
23     memset(head,-1,sizeof head); cnt=0;
24     scanf("%d",&n);
25     for(int i=1,a;i<=n;i++)
26         for(int j=1;j<=n;j++)
27         {
28             scanf("%d",&a);    
29             if(a) add(i,j);
30         }
31 }
32 
33 inline bool dfs(int x)
34 {
35     for(int i=head[x];~i;i=next[i])
36     {
37         if(vis[to[i]]) continue;
38         vis[to[i]]=true;
39         if(linky[to[i]]==-1||dfs(linky[to[i]]))
40         {
41             linky[to[i]]=x;
42             return true;
43         }
44     }
45     return false;
46 }
47 
48 inline void go()
49 {
50     memset(linky,-1,sizeof linky);
51     for(int i=1;i<=n;i++)
52     {
53         memset(vis,0,sizeof vis);
54         dfs(i);
55     }
56     for(int i=1;i<=n;i++)
57         if(linky[i]==-1) {puts("No");return;}
58     puts("Yes");
59 }
60 
61 int main()
62 {
63     int cas; scanf("%d",&cas);
64     while(cas--) read(),go();
65     return 0;
66 }

 

 

posted @ 2013-03-13 00:17  proverbs  阅读(945)  评论(0编辑  收藏  举报