POJ 1274The Perfect Stall (二分图最大匹配问题,匈牙利算法实现)

还是牛的问题,用最大流实现过,但当时看到人家匈牙利算法,按照二分图的最大匹配问题处理的,代码好短啊……

所以决心研习下,看了看,其实不复杂,在注释里有解释,看代码吧

#include<iostream> using namespace std; #define N 201 int n,m,map[N][N],match[N],vis[N]; //match[]保存牛栏匹配的牛的编号 void getmap() { int num,x; memset(map,0,sizeof(map)); for(int i=1;i<=n;i++) { scanf("%d",&num); while(num--) { scanf("%d",&x); map[i][x]=1; } } } int dfs(int a) { for(int i=1;i<=m;i++) { if(map[a][i] && !vis[i]) { vis[i]=1; if( match[i]==-1 || dfs(match[i]) ) //第i个栏还没有被占(是空的),或者占据该栏的牛可以找到其他栏 { match[i]=a; return 1; } } } return 0; } int main() { while(~scanf("%d%d",&n,&m)) { getmap(); int cnt=0; memset(match,-1,sizeof(match)); for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if( dfs(i) ) cnt++; } printf("%d/n",cnt); } return 0; } 

你可能感兴趣的:(POJ 1274The Perfect Stall (二分图最大匹配问题,匈牙利算法实现))