zoukankan      html  css  js  c++  java
  • [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;
    }
  • 相关阅读:
    第九章:switch语句
    第八章:if-else语句
    第七章:运算符及运用
    第六章:名命规范
    事务
    jdbc
    Object
    容器
    Java exception
    Java OO1
  • 原文地址:https://www.cnblogs.com/newera/p/9348209.html
Copyright © 2011-2022 走看看