1. 程式人生 > >[BZOJ 1059] 矩陣遊戲

[BZOJ 1059] 矩陣遊戲

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] 矩陣遊戲