[ZJOI2007]矩阵游戏 二分图匈牙利算法

来源:互联网 发布:nokia5233软件下载 编辑:程序博客网 时间:2024/06/04 20:11

题意:给定01矩阵,可以行列交换,问是否可以使左上到右下的一条对角线全为1。
分析:匈牙利算法,把每个数的行列连一条边,看能否全部匹配。
注意:匈牙利算法dfs里面要dfs(match[i])。

#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>using namespace std;const int maxn=210;int mp[maxn][maxn];int vis[maxn];int match[maxn];int n;bool dfs(int u){    for(int i=1;i<=n;i++){        if(mp[u][i] && !vis[i]){            vis[i]=1;            if(!match[i] || dfs(match[i])){                match[i]=u;                return true;            }        }    }    return false;}int main(){    int T;    scanf("%d",&T);    while(T--){        memset(mp,0,sizeof(mp));        memset(match,0,sizeof(match));        scanf("%d",&n);        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++){                int x;                scanf("%d",&x);                mp[i][j]=x;            }        int ans=0;        for(int i=1;i<=n;i++){            memset(vis,0,sizeof(vis));            if(dfs(i)) ans++;            else break;        }        if(ans==n) printf("Yes\n");        else printf("No\n");    }    return 0;}

^_^

0 0