您好,欢迎来到爱玩科技网。
搜索
您的当前位置:首页BZOJ1059:[ZJOI2007]矩阵游戏——题解

BZOJ1059:[ZJOI2007]矩阵游戏——题解

来源:爱玩科技网

显然如果每行每列都有一个黑格子的话,那么对于每个行胡乱排一下就能构造出答案。

所以我们只需要保证每行每列都至少有一个黑格子,我们用二分图匹配即可。

#include<cmath>
#include<cstdio>
#include<cctype>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N=250;
struct node{
    int to,nxt;
}e[N*N*2];
int cnt,t,n,shu[N],head[N],vis[N];
inline void add(int u,int v){
    e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
bool dfs(int u,int id){
    for(int i=head[u];i;i=e[i].nxt){
    int v=e[i].to;
    if(vis[v]!=id){
        vis[v]=id;
            if(!shu[v]||dfs(shu[v],id)){
                shu[v]=u;
                return 1;
            }
    }
    }
    return 0;
}
int main(){
    scanf("%d",&t);
    while(t--){
    scanf("%d",&n);cnt=0;
    for(int i=1;i<=n;i++)vis[i]=head[i]=shu[i]=0;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
        int a;scanf("%d",&a);
        if(a)add(i,j);
        }
    }
    bool ok=1;
    for(int i=1;i<=n&&ok;i++){
        if(!dfs(i,i))ok=0;
    }
    if(ok)puts("Yes");
    else puts("No");
    }
    return 0;
}

+++++++++++++++++++++++++++++++++++++++++++

 +本文作者:luyouqi233。               +

 +欢迎访问我的博客:+

+++++++++++++++++++++++++++++++++++++++++++

转载于:https://www.cnblogs.com/luyouqi233/p/8543202.html

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- aiwanbo.com 版权所有 赣ICP备2024042808号-3

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务