//hdu 1281 二分匹配
//选重要边的时候,暴力枚举每一条边,如果去掉这条边后最大匹配数减小,则为重要边。
//因为没写#include<iostream> RE了一小时,已哭晕。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace::std;
const int N = 110;
int g[N][N];
struct Hungary{
int used[N],line[N];
void init(){
memset(line,-1,sizeof(line));
}
bool find(int x,int n){
for(int v=0;v<n;v++){
if(g[x][v]&&!used[v]){
used[v]=true;
if(line[v]==-1||find(line[v],n)){
line[v]=x;
return 1;
}
}
}
return 0;
}
int Max_match(int n){
int all=0;
for(int i=0;i<n;i++){
memset(used,0,sizeof(used));
if(find(i,n))all+=1;
}
return all;
}
};
Hungary huy;
int L[N],R[N];
int main(){
int n,m,k;
int ica=1;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
memset(g,0,sizeof(g));
for(int i=0;i<k;i++){
scanf("%d%d",&L[i],&R[i]);
L[i]--;R[i]--;
g[L[i]][R[i]]=1;
}
huy.init();
int ans=huy.Max_match(n);
int sum=0;
for(int i=0;i<k;i++){
g[L[i]][R[i]]=0;
huy.init();
int res=huy.Max_match(n);
if(res<ans)sum++;
g[L[i]][R[i]]=1;
}
printf("Board %d have %d important blanks for %d chessmen.\n",ica++,sum,ans);
}
return 0;
}
hdu 1281 棋盘游戏
最新推荐文章于 2020-04-07 18:40:11 发布