bzoj 1059

思路:第一行他可以指向含有1的那些列,每一行如此,那么每一行指向一列,1-n行指向1-n列,列也是如此。二分图的匹配

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=202;
 4 
 5 int a[N][N],c[N][N];
 6 int vis[N],b[N];
 7 int n;
 8 
 9 bool Find(int x){
10   for(int i=1;i<=n;i++){
11        if(a[x][i]&&!vis[i]){
12            vis[i]=1;
13             if(b[i]==0||Find(b[i])){
14                b[i]=x;
15                return 1;
16             }
17        }
18     }
19     return 0;
20 }
21 int main(){
22     int t;
23     scanf("%d",&t);
24     while(t--){
25         scanf("%d",&n);
26         for(int i=1;i<=n;i++){
27             for(int j=1;j<=n;j++){
28                 scanf("%d",&a[i][j]);
29                 c[i][j]=a[i][j];
30             }
31         }
32         int all=0;
33         for(int i=1;i<=n;i++){
34             memset(vis,0,sizeof(vis));
35             if(Find(i)) all++;
36         }
37         if(all==n) {
38             cout<<"Yes"<<endl;
39         }
40         else {
41             all =0;
42             for(int i=1;i<=n;i++){
43                 for(int j=1;j<=n;j++){
44                      a[i][j]=c[j][i];
45                     // cout<<a[i][j]<<" ";
46                 }
47               //  cout<<endl;
48             }
49             memset(b,0,sizeof(b));
50             for(int i=1;i<=n;i++) {
51                 memset(vis,0,sizeof(vis));
52                 if(Find(i)) all++;
53             }
54             if(all==n) {
55                 cout<<"Yes"<<endl;
56             }
57             else cout<<"No"<<endl;
58         }
59     }
60 }

 

posted on 2017-07-08 13:01  hhhhx  阅读(102)  评论(0编辑  收藏  举报

导航