您的位置:首页 > 其它

二分图最大匹配(匈牙利算法)

2009-07-27 21:29 661 查看
招聘网站评价

算法轮廓:

(1)置M为空

(2)找出一条增广路径P,通过取反操作获得更大的匹配M’代替M

(3)重复(2)操作直到找不出增广路径为止

V2:

#include   <  iostream  >
#include  < fstream >
using   namespace  std;
const   int  MAXN  =   100 ;
int  uN, vN;   // u,v数目
bool  g[MAXN][MAXN]; // g[i][j] 表示 xi与yj相连
int  xM[MAXN], yM[MAXN];  //  输出量
bool  chk[MAXN];  // 辅助量 检查某轮 y[v]是否被check

bool  SearchPath( int  u)
{
int  v;
for  (v = 0 ; v < vN; v ++ )
{
if  (g[u][v]  &&   ! chk[v])
{
chk[v]  =   true ;
if  (yM[v]  ==   - 1   ||  SearchPath(yM[v]))
{
yM[v]  =  u;
xM[u]  =  v;
return   true ;
}
}
}
return   false ;
}

int  MaxMatch()
{
int  u;
int  ret  =   0 ;
memset(xM,  - 1 ,  sizeof (xM));
memset(yM,  - 1 ,  sizeof (yM));
for  (u = 0 ; u < uN; u ++ )
{
if  (xM[u]  ==   - 1 )
{
memset(chk,  false ,  sizeof (chk));
if  (SearchPath(u)) ret ++ ;
}
}
return  ret;
}
int  main()
{
int  i, k;
int  tU, tV;
ifstream cin( " test.txt " );
cin  >>  uN  >>  vN  >>  k;
memset(g,  false ,  sizeof (g));
for  (i = 0 ; i < k; i ++ )
{
cin  >>  tU  >>  tV;
g[tU][tV]  =   true ;
}
int  M  =   MaxMatch();
cout  <<   " Total Match:  "   <<  M  <<  endl;
for  (i = 0 ; i < MAXN; i ++ )
if  (xM[i]  !=   - 1 )
cout  <<  i  <<   '   '   <<  xM[i]  <<  endl;
system( " pause " );

return   0 ;
}

/**/ /* **********
test data:
3 3 3
1 1
1 0
2 2
********** */
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: