标签:
将行和列的标号组成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; }
标签:
原文地址:http://blog.csdn.net/a197p/article/details/46523327