【二分图匹配】hdu 1281 棋盘游戏

来源:互联网 发布:杨百万软件多少钱 编辑:程序博客网 时间:2024/04/30 19:34

http://acm.hdu.edu.cn/showproblem.php?pid=1281

分析:匹配棋盘的行和列(两个“车”不能放在同一行或同一列),算出最大匹配值,然后依次去掉每一个点判断是否可放棋子的数量减少,得出关键点


#include <iostream>#include <cstdio>using namespace std;const int NM=105;int link[NM],flag[NM],a[NM][NM],m;struct Chess{int x,y;}che[NM*NM];int Find(int x){for(int i=1;i<=m;i++)  //m{if(a[x][i]&&!flag[i]){flag[i]=1;if(link[i]==-1||Find(link[i])){link[i]=x;return true;}}}return false;}int main(){int i,j,k,n,T,x,y,sum,ans,ANS;T=0;while(scanf("%d%d%d",&n,&m,&k)!=EOF){memset(a,0,sizeof(a));T++;for(i=0;i<k;i++){scanf("%d%d",&x,&y);che[i].x=x;che[i].y=y;a[x][y]=1;}memset(link,-1,sizeof(link));ans=0;for(i=1;i<=n;i++){memset(flag,0,sizeof(flag));if(Find(i)) ans++;}ANS=0;for(i=0;i<k;i++){a[che[i].x][che[i].y]=0;sum=0;memset(link,-1,sizeof(link));for(j=1;j<=n;j++)  //n{memset(flag,0,sizeof(flag));if(Find(j)) sum++;}if(sum<ans) ANS++;a[che[i].x][che[i].y]=1;}printf("Board %d have %d important blanks for %d chessmen.\n",T,ANS,ans);}return 0;}


0 0
原创粉丝点击