链接:点击打开链接
题意:N*M的棋盘,接下来的K行描述了所有格子的信息:每行两个数X和Y,表示了这个格子在棋盘中的位置.问重点格子的个数和不同行不同列的棋子个数(如果拿掉一个格子的棋子之后不同行不同列的个数改变则这个格子叫重点格子)
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> using namespace std; int n,m,k; int s[105][105],match[105],vis[105],xx[105],yy[105]; int dfs(int x){ int i,j; for(i=1;i<=m;i++){ if(!vis[i]&&s[x][i]){ vis[i]=1; if(!match[i]||dfs(match[i])){ match[i]=x; return 1; } } } return 0; } int hungarian(){ int i,sum; sum=0; for(i=1;i<=n;i++){ memset(vis,0,sizeof(vis)); if(dfs(i)) sum++; } return sum; } //匈牙利算法 int main(){ int i,j,cur,ans,sum,temp; cur=1; while(scanf("%d%d%d",&n,&m,&k)!=EOF){ memset(s,0,sizeof(s)); memset(match,0,sizeof(match)); for(i=1;i<=k;i++){ scanf("%d%d",&xx[i],&yy[i]); s[xx[i]][yy[i]]=1; } ans=hungarian(); //不同行不同列的个数 sum=0; for(i=1;i<=k;i++){ s[xx[i]][yy[i]]=0; //遍历所有可放棋子的格子 memset(match,0,sizeof(match)); temp=hungarian(); //不要忘记初始化match数组 if(temp!=ans) sum++; s[xx[i]][yy[i]]=1; } printf("Board %d have %d important blanks for %d chessmen.\n",cur++,sum,ans); } return 0; }