二分图——洛谷P1129 [ZJOI2007]矩阵游戏

来源:互联网 发布:守望先锋英雄数据库 编辑:程序博客网 时间:2024/06/08 16:06

https://www.luogu.org/problem/show?pid=1129
二分图的基本建模;
我们发现一个行一个列只要有一个点就好啦;
意味着我们每一行上的多个点其实最多只移动一颗;
所以直接大力二分图,a[i,j]有点i连接j;
表示i行可以有j列移过来;

#include<bits/stdc++.h>using namespace std;const int N=205;struct cs{int to,nxt;}a[N*N*2];int head[N],ll,link[N];int n,m,x,ans;bool vi[N];void init(int x,int y){    a[++ll].to=y;    a[ll].nxt=head[x];    head[x]=ll;}bool dfs(int x){    for(int k=head[x];k;k=a[k].nxt)        if(!vi[a[k].to]){            vi[a[k].to]=1;            if(!link[a[k].to]||dfs(link[a[k].to])){                link[a[k].to]=x;return 1;            }        }return 0;}int main(){    scanf("%d",&m);    while(m--){        ll=0;memset(head,0,sizeof head);        ans=0;memset(link,0,sizeof link);        scanf("%d",&n);        for(int i=1;i<=n;i++)            for(int j=1;j<=n;j++){                scanf("%d",&x);                if(x)init(i,j);            }        for(int i=1;i<=n;i++){            memset(vi,0,sizeof vi);            if(dfs(i))ans++;        }        if(ans==n)printf("Yes\n");else printf("No\n");    }}
原创粉丝点击