POJ 1274 The Perfect Stall ( 匈牙利算法 )

 

 

比较水的二分图匹配,用模板就能过。这是我的第一个二分图匹配题目,经过了几天的理论与算法过程钻研之后,我感觉他并不像曾经听到他名字时候那么难,今天突然想上手试一试,敲完后1Y,十分激动。

 

理解二分图匹配有一篇比较好的博文:(AekdyCoin大牛的空间)

http://hi.baidu.com/aekdycoin/blog/item/4f410a8c17e1181bb31bba80.html/cmtid/e2f7b0eba5f1b6ddd539c9f6#e2f7b0eba5f1b6ddd539c9f6

 

#include<stdio.h> #include<string.h> #include<stdlib.h> int n,m,nstall; int g[201][201]; int xm[201],ym[201],chk[201]; int searchpath(int u) { int v; for( v = 1; v <= m; v++ ) if( g[u][v] && !chk[v] ) { chk[v] = 1; if( ym[v] == -1 || searchpath(ym[v])) { ym[v] = u; xm[u] = v; return 1; } } return 0; } int maxpath(void) { int u,ret = 0; memset(xm,-1,sizeof(xm)); memset(ym,-1,sizeof(ym)); for( u = 1; u <= n; u ++ ) if( xm[u] == -1 ) { memset(chk,0,sizeof(chk)); if( searchpath(u) ) ret++; } return ret ++; } int main(void) { int i,j,t; while( scanf("%d%d",&n,&m) != EOF ) { memset(g,0,sizeof(g)); for( i = 1; i <= n; i++ ) { scanf("%d",&nstall); for( j = 1; j <= nstall; j++ ) { scanf("%d",&t); g[i][t] = 1; } } printf("%d/n",maxpath()); } return 0; }  

你可能感兴趣的:(POJ 1274 The Perfect Stall ( 匈牙利算法 ))