[ZJOI2007]矩阵游戏

[ZJOI2007]矩阵游戏

题面

链接

题解

把行和列看成二分图的两个点集

目标是要让每行每列都匹配

显然更改行和列不会影响匹配的结果

即行和列最大匹配为N时一定满足

#include<bits/stdc++.h>

using namespace std;

const int MAXN = 500 + 10;

inline int read()
{
    int f=1,x=0;
    char ch;
    do
    {
        ch=getchar();
        if(ch=='-') f=-1;
    }while(ch<'0'||ch>'9');
    do
    {
        x=(x<<3)+(x<<1)+ch-'0';
        ch=getchar();
    }while(ch>='0'&&ch<='9');
    return f*x;
}

int t;
int n;
int g[MAXN][MAXN];
int vis[MAXN];
int li[MAXN];

inline bool dfs(int x)
{
    if(x==0) return 1;
    for(int i=1;i<=n;i++)
    {
        if(g[x][i]&&!vis[i])
        {
            vis[i]=1;
            if(dfs(li[i]))
            {
                li[i]=x;
                return 1;
            }
        }
    }
    return 0; 
}

int main()
{
    t=read();
    while(t--)
    {
        n=read();
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                g[i][j]=read();
        int ans=0;
        for(int i=1;i<=n;i++)
        {    
            memset(vis,0,sizeof(vis));
            if(dfs(i)) ans++;
        }
        memset(li,0,sizeof(li));
        if(ans==n) printf("Yes\n");
        else printf("No\n");
    }
}

 

posted @ 2019-07-24 18:47  wlzs1432  阅读(164)  评论(0编辑  收藏  举报