先求出原图的最大匹配t1,在一次枚举每个map【】【】为1的点,看是否小于t1,如果小于则是重要点;
#include<stdio.h>
#include<string.h>
#define maxn 102
int map[maxn][maxn];
int use[maxn],path[maxn];
bool dfs(int x,int m)
{
for(int i=1;i<=m;i++)
{
if(!use[i]&&map[x][i])
{
use[i]=1;
if(!path[i]||dfs(path[i],m))
{
path[i]=x;
return true ;
}
}
}
return false ;
}
int match(int n,int m)
{
int sum=0;
memset(path,0,sizeof(path));
for(int i=1;i<=n;i++)
{
memset(use,0,sizeof(use));
if(dfs(i,m)) sum++;
}
return sum;
}
int main()
{
int i,n,a,b,k,t=1,m,j;
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(map,0,sizeof(map));
while(k--)
{
scanf("%d%d",&a,&b);
map[a][b]=1;
}
int t1,t2=0;
t1=match(n,m);
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(map[i][j])
{
map[i][j]=0;
if(match(n,m)<t1) t2++;
map[i][j]=1;
}
}
printf("Board %d have %d important blanks for %d chessmen.\n",t++,t2,t1);
}
return 0;
}

被折叠的 条评论
为什么被折叠?



