1059: [ZJOI2007]矩阵游戏

来源:互联网 发布:宏业软件怎么用 编辑:程序博客网 时间:2024/06/16 04:51

题目链接

题目大意:给定一个n×n的01矩阵,可以任意交换两行或两列的数字,问是否能调整出一个局面,使得矩阵的主对角线(左上角到右下角的连线)上都是1。

题解:想到把行和列建成二分图了,可是没想好具体怎么搞……膜了一发题解
Orz
黄学长说,同行同列的点交换后还是同行同列,然后求能否找到n个互不同行互不同列的点。

我的收获:二分图

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int M=205;int T,n,lik[M];bool mp[M][M],vis[M];bool hungary(int x){    for(int i=1;i<=n;i++){        if(!mp[x][i]||vis[i]) continue;        vis[i]=true;        if(!lik[i]||hungary(lik[i])) return lik[i]=x;    }    return false;}void work(){    for(int i=1;i<=n;i++){        memset(vis,0,sizeof(vis));        if(!hungary(i)) {puts("No");return ;}    }    puts("Yes");}void init(){    int x;memset(lik,0,sizeof(lik));    cin>>n;    for(int i=1;i<=n;i++)        for(int j=1;j<=n;j++)            scanf("%d",&x),mp[i][j]=(bool)x;}int main(){    cin>>T;    while(T--)    {        init();        work();    }    return 0;}
原创粉丝点击