[BZOJ 1059] 矩陣遊戲
阿新 • • 發佈:2018-07-22
vector ear lin for 構造 sizeof false i++ ++
Link:
BZOJ 1059 傳送門
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; }
[BZOJ 1059] 矩陣遊戲