大意:问有几个点删除之后最大匹配数会减少
思路:因为每行每列只能放一个车,所以可以看成是行和列的匹配参考博客
#include<bits/stdc++.h>
#define maxn 105
using namespace std;
int n,m,k;
bool maps[maxn][maxn];
int x[maxn*maxn],y[maxn*maxn],match[maxn],vis[maxn];
bool dfs(int u){
for(int i=1;i<=m;i++){
if(!vis[i]&&maps[u][i]){
vis[i]=1;
if(!match[i]||dfs(match[i])){
match[i]=u;
return true;
}
}
}
return false;
}
int find(){
int sum=0;
memset(match,0,sizeof match);
for(int i=1;i<=n;i++){
memset(vis,0,sizeof vis);
if(dfs(i)){
sum++;
}
}
return sum;
}
int main(){
// freopen("in.txt","r",stdin);
int cases=1;
while(~scanf("%d%d%d",&n,&m,&k)){
memset(maps,false,sizeof maps);
for(int i=1;i<=k;i++){
scanf("%d%d",&x[i],&y[i]);
maps[x[i]][y[i]]=true;
}
int ans=find();
int s=0;
for(int i=1;i<=k;i++){
maps[x[i]][y[i]]=false;
int del=find();
if(del<ans){
s++;
}
maps[x[i]][y[i]]=true;
}
printf("Board %d have %d important blanks for %d chessmen.\n",cases++,s,ans);
}
return 0;
}