匈牙利算法

/*
  Name: 匈牙利算法 
  Copyright: 
  Author: 巧若拙 
  Date: 12-06-17 10:52
  Description: 
*/
#include <iostream>
#include <math.h>
using namespace std;

#define MAX 502
int map[MAX][MAX];
int n,k;
int mk[MAX];
//从X集合中的顶点u出发用深度优先的策略寻找增广路
//(这种增广路只能使当前的匹配数增加1)
int nx,ny; //X和Y集合中顶点的个数
int cx[MAX], cy[MAX];
//cx[i]表示最终求得的最大匹配中与Xi匹配的Y顶点, cy[i]同理

int Path(int u);
int MaxMatch(); //求二部图最大匹配的匈牙利算法

int main()
{
    int i,j;
    int a,b;
    
    cin >> n >> k;
    nx = ny = n;
    memset(map,0,sizeof(map));
    for (i=0; i<k; i++)
    {
	    cin >> a >> b;
	    map[a][b] = 1; //表示Xa和Yb有连接 
    }
    int max=MaxMatch();
    cout << max << endl;
    
    system("pause");                       
    return 0;
}

int Path(int u)
{
    for (int v=0; v<ny; v++) //考虑所有Yi顶点v
    {
        if (map[u][v]!=0 && mk[v]==0)
	    {
	        mk[v] = 1;
	   //如果v没有匹配,或者如果v已经匹配了,但从y[v]出发可以找到一条新的增广路
	        if (cy[v]==-1 || Path(cy[v]))
	        {
	            cx[u] = v; //把v匹配给u
	            cy[v] = u; //把u匹配给v
	            return 1; //找到可增广路
	        }
	    }
    }
    return 0 ; //如果不存在从u出发的增广路
}

int MaxMatch() //求二部图最大匹配的匈牙利算法
{
    int res=0;
    
    for(int i=0; i<MAX; ++i) //初始化列表 
    {
	    cx[i] = cy[i] = -1;
    }
    
    for (int i=0; i<nx; i++)
    {
        if (cx[i] == -1) //从每个未盖点出发进行寻找增广路
        {
            memset(mk, 0, sizeof(mk));
            res += Path(i); //每找到一条增广路,可使得匹配数加1
        }
    }
    return res;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值