1. 程式人生 > >[ZJOI2007]矩陣遊戲 二分圖匈牙利演算法

[ZJOI2007]矩陣遊戲 二分圖匈牙利演算法

題意:給定01矩陣,可以行列交換,問是否可以使左上到右下的一條對角線全為1。
分析:匈牙利演算法,把每個數的行列連一條邊,看能否全部匹配。
注意:匈牙利演算法dfs裡面要dfs(match[i])。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=210;
int mp[maxn][maxn];
int vis[maxn];
int match[maxn];
int n;
bool
dfs(int u){ for(int i=1;i<=n;i++){ if(mp[u][i] && !vis[i]){ vis[i]=1; if(!match[i] || dfs(match[i])){ match[i]=u; return true; } } } return false; } int main(){ int T; scanf("%d",&T); while
(T--){ memset(mp,0,sizeof(mp)); memset(match,0,sizeof(match)); scanf("%d",&n); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){ int x; scanf("%d",&x); mp[i][j]=x; } int ans=0; for
(int i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; else break; } if(ans==n) printf("Yes\n"); else printf("No\n"); } return 0; }

^_^