BZOJ1059_矩阵游戏_KEY

题目传送门

由题意可得,这道题是求使一些行上的1是否能两两不同行,两两不同列。

于是我们就可以把1点的i与j连边,做一遍二分图匹配。

如果每一行即i都可以匹配到,那么就有解。

code

/**************************************************************
    Problem: 1059
    User: yekehe
    Language: C++
    Result: Accepted
    Time:360 ms
    Memory:1448 kb
****************************************************************/

#include <bits/stdc++.h>
using namespace std;
int T,a[201][201],n,tot,vis[201],wt[201],ans;
bool find(int x){
    for(int i=1;i<=n;i++){
        if(!vis[i]&&a[x][i]){
            vis[i]=1;
            if(!wt[i]||find(wt[i])){
                wt[i]=x;
                return 1;
            }
        }
    }
    return 0;
}
int main(){
    scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            memset(wt,0,sizeof(wt));
                for(int i=1;i<=n;i++)
                    for(int j=1;j<=n;j++)
                        scanf("%d",&a[i][j]);
            int ans=0;
                for(int i=1;i<=n;i++){
                    memset(vis,0,sizeof(vis));
                    ans+=find(i);
                }
            if(ans==n)puts("Yes");
            else puts("No");
        }
}

 

posted @ 2017-09-25 19:16  Cptraser  阅读(123)  评论(0编辑  收藏  举报