将行和列的标号组成X和Y集合,然后如果x,y坐标可以放车,就在x和y点之间连一条线,不同行和列车就不会相互攻击,所以求出最大匹配就是所得的最多可放车额个数 然后枚举每个点,判断其是否为重要点


#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
#define N 102
int map[N][N],visit[N],match[N];
int n,m,k;
struct node
{
int x,y;
}rc[N*N];
bool DFS(int k){
for(int i=1;i<=m;i++){
if(visit[i]||!map[k][i]) continue;
visit[i]=1;
if(!match[i]||DFS(match[i])){
match[i]=k;
return true;
}
}
return false;
}
int Match(){
memset(match,0,sizeof(match));
int cnt=0;
for(int i=1;i<=n;i++){
memset(visit,0,sizeof(visit));
if(DFS(i)) cnt++;
}
return cnt;
}
int main()
{
int i,t=1;
while(scanf("%d%d%d",&n,&m,&k)!=EOF){
memset(map,0,sizeof(map));
for(i=1;i<=k;i++){
scanf("%d%d",&rc[i].x,&rc[i].y);
map[rc[i].x][rc[i].y]=1;
}
int num=0,ans;
ans=Match();
for(i=1;i<=k;i++){
map[rc[i].x][rc[i].y]=0;
if(ans>Match()) num++;
map[rc[i].x][rc[i].y]=1;
}
printf("Board %d have %d important blanks for %d chessmen.\n",t++,num,ans);
}
return 0;
}