BZOJ 1059 矩阵游戏 (二分图最大匹配) (匈牙利算法)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huatian5/article/details/51147527

  思路:这里要知道,如果要得到对角线全为黑色(1)的话,使得必须存在黑棋的行和列都不一样的情况,要找这种情况,就相当于,把行和列分别当成二部图(也可叫成二分图)的两个子集,相当于求解二分图的最大匹配。模板已由前几篇文章给出,所以只需要稍作修改就好了。

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
int match[205][205],use[205],girl[205];
bool dfs(int x)
{
    for(int i=1;i<=n;i++)
    {
        //如果有倾向,并且没有标记过
        if(match[x][i]==true&&use[i]==false)
        {
            use[i]=true;//判断过的就进行标记
            if(girl[i]==0||dfs(girl[i]))
            {
                girl[i]=x;//这里用到递归
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        memset(match,0,sizeof(match));
        memset(girl,0,sizeof(girl));
        int x;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
            cin>>x;
            if(x)
                match[i][j]=1;
            }
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            memset(use,0,sizeof(use));
            if(dfs(i))
                ans++;
        }
        if(ans==n)
            printf("Yes\n");
        else
            printf("No\n");
    }
    return 0;
}


阅读更多
换一批

没有更多推荐了,返回首页