[ZJOI2007]矩阵游戏

以行,列为左右部点,跑最大匹配,匹配数为n即可。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T,n,tim;
int g[205][205];int vis[205],match[205];
bool dfs(int x) {
  for(int i=1;i<=n;i++)
    if(g[x][i]&&(vis[i]!=tim)) {
      vis[i]=tim;
      if(!match[i]||dfs(match[i])) {match[i]=x;return 1;}
    }
    return 0;
}
int main() {
  scanf("%d",&T);
  while(T--) {
    scanf("%d",&n);
    memset(g,0,sizeof g);
    memset(match,0,sizeof match);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=n;j++)
    scanf("%d",&g[i][j]);
    int ans=0;
    tim=0;
    memset(vis,0,sizeof vis);
    for(int i=1;i<=n;i++)
    ++tim,ans+=(int)dfs(i);
    if(ans!=n) puts("No");
    else puts("Yes");
  }
}
posted @ 2018-07-27 07:18  SWHsz  阅读(94)  评论(0编辑  收藏  举报