hdu 1281 棋盘游戏 二分图匹配

来源:互联网 发布:淘宝网发布商品怎么分 编辑:程序博客网 时间:2024/05/01 01:48
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;#define N 110bool edge[N][N];int linker[N];bool vis[N];int n,m;struct node{int r,c;}s[100*N];bool dfs(int u){for(int i=1;i<=m;i++){if(edge[u][i]&&!vis[i]){vis[i]=1;if(linker[i]==-1||dfs(linker[i])){linker[i]=u;return true;}}}return false;}int hungary(){int cnt=0;memset(linker,-1,sizeof(linker));for(int i=1;i<=n;i++){memset(vis,0,sizeof(vis));if(dfs(i)) cnt++;}return cnt;}int main(){int k,f=1;while(scanf("%d%d%d",&n,&m,&k)!=EOF){int r,c;memset(edge,0,sizeof(edge));for(int i=0;i<k;i++){scanf("%d%d",&r,&c);s[i].r=r;s[i].c=c;edge[r][c]=1;}int maxn=hungary();int cnt=0;for(int i=0;i<k;i++){r=s[i].r;c=s[i].c;edge[r][c]=0;int temp=hungary();if(temp!=maxn) cnt++;edge[r][c]=1;}printf("Board %d have %d important blanks for %d chessmen.\n",f++,cnt,maxn);}return 0;}
图论的核心应该就是建图了,这题就是这个问题
因为不能放车的地方不影响车的互相攻击,所以可以将横坐标,与纵坐标看做是两个不同集合,然后就是求将横纵一一对应的最大数量,也就是二分图的最大匹配了。。
至于关键点的确定,就是去掉后再进行匹配看最大匹配数是否减少。