求二分圖最大匹配,直接讀入就行,圖都不用建
可以當成最大匹配的模板。。
#include<iostream>
#include<cstring>
#include<cstdio>
const int MAXN=510;
int uN,vN;//u,v數目
int g[MAXN][MAXN];
int linker[MAXN];
bool used[MAXN];
bool dfs(int u)//從左邊開始找增廣路徑
{
int v;
for(v=1;v<=vN;v++)//這個頂點編號從0開始,若要從1開始需要修改
if(g[u][v]&&!used[v])
{
used[v]=true;
if(linker[v]==-1||dfs(linker[v]))
{//找增廣路,反向
linker[v]=u;
return true;
}
}
return false;//這個不要忘了,經常忘記這句
}
int hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=1;u<=uN;u++)
{
memset(used,0,sizeof(used));
if(dfs(u)) res++;
}
return res;
}
int main()
{
int T,Ti;
scanf("%d",&T);
for (Ti=1;Ti<=T;Ti++)
{
scanf("%d",&uN);
vN=uN;
for (int i=1;i<=uN;i++)
for (int j=1;j<=uN;j++)
scanf("%d",&g[i][j]);
if (hungary()==uN) printf("Yes\n"); else printf("No\n");
}
while (1);
return 0;
}