[BZOJ 1059] 矩阵游戏

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;
}

 

posted @ 2018-07-21 21:56  NewErA  阅读(136)  评论(0编辑  收藏  举报