矩阵游戏:二分图
本题需要一定的思考量。
对于位于(x,y)的一黑色,无论如何换,它的相对位置总不会发生变化,也就是不会有两个(x,y)位置的黑色
那么如果我们想让对角线上布满黑色,就可以将题目转化为
判断是否有n个满足横纵坐标互不相同的黑色
二分图匹配即可。
Code
#include<cstdio> #include<cstring> using namespace std; const int N=20000; int ans,n,num_bian,nxt[N<<1],to[N<<1],head[N],vis[N],match[N]; void add(int x,int y){ nxt[++num_bian]=head[x],head[x]=num_bian,to[num_bian]=y; } bool dfs(int x){ for(int i=head[x],y;i;i=nxt[i]) if(!vis[y=to[i]]){ vis[y]=1; if(!match[y]||dfs(match[y])){match[y]=x;return true;} } return false; } void work(){ scanf("%d",&n); num_bian=0;ans=0; memset(head,0,sizeof(head)); memset(match,0,sizeof(match)); for(int i=1;i<=n;++i) for(int j=1,x;j<=n;++j){ scanf("%d",&x); if(x)add(i,j); } for(int i=1;i<=n;++i){ memset(vis,0,sizeof(vis)); if(dfs(i))ans++; } if(ans==n)puts("Yes"); else puts("No"); } int main(){ int T;scanf("%d",&T); while(T--)work(); return 0; }
Keep it simple and stupid.