bzoj1059: [ZJOI2007]矩阵游戏

二分图匹配。

$VMMT_Q(NK4B(%R5A525%PX

补充,感觉之前说的不够详细,如果有完美匹配的话,每行都有一个对应的列,那么换来换去以后,对角线就全黑了。。。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 400 + 10;

bool vis[maxn];
int p[maxn],map[maxn][maxn];
int n,T;

bool find(int x) {
    if(vis[x]) return false;
    vis[x]=1;
    
    for(int i=1;i<=n;i++) 
        if(map[x][i]) {
            if(!p[i] || find(p[i])) {
                p[i]=x;
                return true;
        }
    }
    return false;
}

bool work() {
    memset(p,0,sizeof(p));
    for(int i=1;i<=n;i++) {
        memset(vis,0,sizeof(vis));
        if(!find(i)) 
            return false;
    }
    return true;    
}

int main() {
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        memset(map,0,sizeof(map)); 
        for(int i=1;i<=n;i++)
        for(int j=1;j<=n;j++) 
            scanf("%d",&map[i][j]);
        if(work()) printf("Yes\n");
        else printf("No\n");
    }
    return 0;
}
posted @ 2016-05-25 19:30  invoid  阅读(149)  评论(0编辑  收藏  举报