#include <stdio.h>
#include <string.h>
#define maxn 150
int n,m,k;
int G[maxn][maxn];
int mark[maxn];
bool visit[maxn];
int path(int u)
{
int i;
for(i=1;i<=m;i++)
{
if(G[u][i] && !visit[i])
{
visit[i]=true;
if(mark[i]==-1 || path(mark[i]))
{
mark[i]=u;
return 1;
}
}
}
return 0;
}
int Max_Match()
{
int i,ans;
memset(mark,-1,sizeof(mark));
ans=0;
for(i=1;i<=n;i++)
{
memset(visit,false,sizeof(visit));
if(path(i))
ans++;
}
return ans;
}
int main()
{
int i,j,a,b,ncase=1;
int e[maxn*maxn][2];
while(scanf("%d%d%d",&n,&m,&k)==3)
{
memset(G,0,sizeof(G)) ;
for(i=1;i<=k;i++)
{
scanf("%d%d",&a,&b);
G[a][b]=1;
e[i][0]=a;
e[i][1]=b;
}
int sum=Max_Match();
int temp,C=0;
for(i=1;i<=k;i++)
{
G[e[i][0]][e[i][1]]=0;
temp=Max_Match();
G[e[i][0]][e[i][1]]=1;
if(temp<sum)
C++;
}
printf("Board %d have %d important blanks for %d chessmen.\n",ncase++,C,sum);
}
}
hdu 棋盘游戏 (求二分图最大匹配的关键点)
最新推荐文章于 2020-05-10 12:34:21 发布