用匈牙利算法求二分图的最大匹配

1,  用匈牙利算法求二分图的最大匹配


算法轮廓:
(1)置M为空
(2)找出一条增广路径P,通过取反操作获得更大的匹配M’代替M
(3)重复(2)操作直到找不出增广路径为止
程序文件夹:22222


#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));//Sets buffers to a specified character.


             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
********** */ 


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值