hdu1281 二分匹配
求重要的点。那就可以通过枚举来找;先做一次最大匹配,求出匹配数。然后逐一枚举这些点。如果匹配数改变,那就是重要点;
#include<stdio.h> #include<string.h> int map[103][103],n,m,vis[103],match[103]; int x[103],y[103]; int dfs(int u) { int i,j; for(i=1;i<=m;i++) { if(!vis[i]&&map[u][i]) { vis[i]=1; if(match[i]==-1||dfs(match[i])) { match[i]=u; return 1; } } } return 0; } int main() { int i,j,k,ff=0; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { memset(map,0,sizeof(map)); for(i=0;i<k;i++) { scanf("%d%d",&x[i],&y[i]); map[x[i]][y[i]]=1; } memset(match,-1,sizeof(match)); int ans=0; for(i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(dfs(i)) ans++; } int test=0,flag; int sum=0; for(i=0;i<k;i++) { flag=map[x[i]][y[i]]; map[x[i]][y[i]]=0; test=0; memset(match,-1,sizeof(match)); for(j=1;j<=n;j++) { memset(vis,0,sizeof(vis)); if(dfs(j)) test++; } if(test!=ans) sum++; map[x[i]][y[i]]=flag; } printf("Board %d have %d important blanks for %d chessmen.\n",++ff,sum,ans); } }