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 }