[bzoj1059]矩阵游戏

对于同一行或同一列的点,不论如何交换都在同一行或同一列,而最终这n个点行和列各不相同,因此即要找到n个点,使得行和列不同
然后对于每一个1,将所在行和所在列连边,二分图能完全匹配那么就说明存在这种方案

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 struct ji{
 4     int nex,to;
 5 }edge[40005];
 6 int E,t,n,x,ans,mat[405],vis[405],head[405];
 7 void add(int x,int y){
 8     edge[E].nex=head[x];
 9     edge[E].to=y;
10     head[x]=E++;
11 }
12 bool dfs(int k){
13     if (vis[k])return 0;
14     vis[k]=1;
15     for(int i=head[k];i!=-1;i=edge[i].nex){
16         int v=edge[i].to;
17         if ((!mat[v])||(dfs(mat[v]))){
18             mat[v]=k;
19             return 1;
20         }
21     }
22     return 0;
23 }
24 int main(){
25     scanf("%d",&t);
26     while (t--){
27         scanf("%d",&n);
28         E=ans=0;
29         memset(mat,0,sizeof(mat));
30         memset(head,-1,sizeof(head));
31         for(int i=1;i<=n;i++)
32             for(int j=1;j<=n;j++){
33                 scanf("%d",&x);
34                 if (x)add(i,n+j);
35             }
36         for(int i=1;i<=n;i++){
37             memset(vis,0,sizeof(vis));
38             ans+=dfs(i);
39         }
40         if (ans==n)printf("Yes\n");
41         else printf("No\n");
42     }
43 }
View Code

 

posted @ 2019-11-01 16:41  PYWBKTDA  阅读(128)  评论(0编辑  收藏  举报