bzoj 1059 [ ZJOI 2007 ] 矩阵游戏 —— 二分图匹配
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1059
每一列选出一个占据一行才可以;
挫败。
代码如下:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int const maxn=205; int T,n,pre[maxn],hd[maxn],ct; bool vis[maxn]; struct N{ int to,nxt; N(int t=0,int n=0):to(t),nxt(n) {} }ed[maxn*maxn]; void add(int x,int y){ed[++ct]=N(y,hd[x]); hd[x]=ct;} bool dfs(int x) { for(int i=hd[x],u;i;i=ed[i].nxt) { if(vis[u=ed[i].to])continue; vis[u]=1; if(!pre[u]||dfs(pre[u])){pre[u]=x; return 1;} } return 0; } int main() { scanf("%d",&T); while(T--) { scanf("%d",&n); memset(hd,0,sizeof hd); ct=0; for(int i=1;i<=n;i++) for(int j=1,x;j<=n;j++) { scanf("%d",&x); if(x)add(i,j); } memset(pre,0,sizeof pre); int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof vis); if(dfs(i))ans++; } if(ans==n)printf("Yes\n"); else printf("No\n"); } return 0; }