题意:
中文题,但是我一开始理解不了,知道看了别人说的才理解。。。突然发现自己看有道翻译的理解能力强的一笔,导致我语文能力直白翻译能力直线下降。。。ORZ
题解:
其实是这样问你的如果删除了某个可以放车的点的从而造成了达不到最大匹配数的点有多少个,这样你是不是理解了?那么怎么做呢,暴力枚举,删除一条边之后进行二分图匹配,然后查看得到的匹配数是否少于最大匹配数即可。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=100+7;
struct node
{
int x,y;
}p[MAXN];
bool map[MAXN][MAXN];
bool vis[MAXN];
int cx[MAXN],cy[MAXN];
int n,m,k;
int dfs(int u)
{
for(int v=1;v<=m;v++)
{
if(map[u][v]&&!vis[v])
{
vis[v]=true;
if(cy[v]==-1||dfs(cy[v]))
{
cx[u]=v;
cy[v]=u;
return 1;
}
}
}
return 0;
}
int hungary()
{
memset(cx,-1,sizeof(cx));
memset(cy,-1,sizeof(cy));
int res=0;
for(int i=1;i<=n;i++)
{
memset(vis,false,sizeof(vis));
res+=dfs(i);
}
return res;
}
int main()
{
int Case=1;
while(~scanf("%d%d%d",&n,&m,&k))
{
memset(map,false,sizeof(map));
for(int i=1;i<=k;i++)
{
scanf("%d%d",&p[i].x,&p[i].y);
map[p[i].x][p[i].y]=true;
}
int sum=hungary(),ans=0;
for(int i=1;i<=k;i++)
{
map[p[i].x][p[i].y]=false;
if(hungary()<sum)
ans++;
map[p[i].x][p[i].y]=true;
}
printf("Board %d have %d important blanks for %d chessmen.\n",Case++,ans,sum);
}
}