【BZOJ】1059: [ZJOI2007]矩阵游戏(二分图匹配)
题目
传送门:QWQ
分析
把行和列分别看做二分图的两个集合
每一个在$ (x,y) $处的1,连接$ G[i]->j $
然后跑二分图匹配
代码
#include <bits/stdc++.h> using namespace std; const int maxn=300; int s[maxn][maxn]; int vis[maxn],n,matchy[maxn]; vector<int> G[maxn]; int hungary(int u){ for(int i=0;i<G[u].size();i++){ int v=G[u][i]; if(vis[v])continue; vis[v]=1; if(!matchy[v]||hungary(matchy[v])){ matchy[v]=u; return true; } } return false; } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); for(int i=0;i<=n;i++) G[i].clear(); memset(matchy,0,sizeof(matchy)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++) scanf("%d",&s[i][j]); } for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(s[i][j]==1) G[i].push_back(j); } } int ans=0; for(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(hungary(i)) ans++; } if(ans==n) puts("Yes"); else puts("No"); // printf("------------ %d\n",ans); } return 0; } /* 3 2 0 0 0 1 3 0 0 1 0 1 0 1 0 0 5 1 0 0 0 1 0 0 1 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 */