求最大匹配和必要点
求必要点:一一枚举,判断去掉这个点之后最大匹配数是否变化
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 105
using namespace std;
int n,m,k;
int g[N][N];
int linker[N];
bool usde[N];
bool dfs(int u)
{
int v;
for(v=1;v<=m;v++)
{
if(g[u][v]&&!usde[v])
{
usde[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<=n;u++)
{
memset(usde,0,sizeof(usde));
if(dfs(u))
res++;
}
// cout<<res<<endl;
return res;
}
int main()
{
int x,y,ans,icase=0;
while(scanf("%d%d%d",&n,&m,&k)!=EOF)
{
icase++;
ans=0;
memset(g,0,sizeof(g));
while(k--)
{
scanf("%d%d",&x,&y);
g[x][y]=1;
}
k=hungary();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(g[i][j]==1)
{
g[i][j]=0;
if(hungary()!=k)
ans++;//cout<<i<<' '<<j<<endl;}
g[i][j]=1;
}
}
}
printf("Board %d have %d important blanks for %d chessmen.\n",icase,ans,k);
}
return 0;
}