/*
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;
}
匈牙利算法
最新推荐文章于 2024-02-25 12:33:56 发布