[BZOJ 1059] 矩阵游戏
Link:
Solution:
可以发现其实只要保证每行每列刚好只有一个就能确保构造出解
于是建立列集合与行集合的对应直接跑二分图匹配即可
Code:
#include <bits/stdc++.h> using namespace std; int T,n,vis[2005],match[2005]; vector<int> a[2005]; void add_edge(int u,int v) { a[u].push_back(v); a[v].push_back(u); } int dfs(int u) { vis[u]=true; for(int i=0;i<a[u].size();i++) { int v=a[u][i],m=match[v]; if(m==-1 || !vis[m] && dfs(m)) { match[u]=v; match[v]=u; return true; } } return false; } int main() { cin >> T; while(T--) { cin >> n;int res=0; memset(match,-1,sizeof(match)); for(int i=0;i<2005;i++) a[i].clear(); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { int x;cin >> x; if(x) add_edge(i,j+n); } for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); res+=dfs(i); } if(res==n) cout << "Yes" << endl; else cout << "No" << endl; } return 0; }