二部图-匈牙利算法实现

  • 两篇参考网址
  • http://blog.csdn.net/dark_scope/article/details/8880547 相亲举例
  • http://m.blog.csdn.net/blog/fyxz1314/37651567 偏公式
增广路径:非匹配边->匹配边->非匹配边组成的路径 递归:将之前匹配边的女生赋给新的男生,之前匹配边的男生重新找到心仪的女生,如此递归。
#include 
#include 

using namespace std;

#define MAXN 100

int m,n; // 男女生数目

bool edge[MAXN][MAXN]; // 男生是否心仪某女生
int link[MAXN]; // 右边的点和左边哪个点陪陪
bool visit[MAXN]; // 该女生是否被访问过


bool find_path(int u)
{
	for (int v = 1; v <= n; ++v) // 遍历右边顶点
	{
		if (edge[u][v] && !visit[v])
		{
			visit[v] = true;
			if (!link[v] || find_path(link[v])) // 右边顶点还没有匹配,或已经匹配的左边顶点可以去寻找另一个右边顶点,而把该右边顶点让给当前左边顶点
			{
				link[v] = u; // 这就相当于加一个匹配边了
				return true;
			}
		}
	}
	return false;
}

// 返回匹配边数目
int hungary()
{
	int ans = 0;
	memset(link, 0, sizeof(link));

	for (int u = 1; u <= m; ++u) // 遍历左边男生
	{
		memset(visit, false, sizeof(visit));
		if (find_path(u)) // 发现有增广路径
			++ans;
	}
	return ans;
}

int main()
{
	memset(edge, false, sizeof(edge));
	ifstream in("data.txt");	
	in >> m >> n;
	int a,b;
	while (in >> a >> b)
	{
		edge[a][b] = true;
	}
	in.close();

	cout << "最大匹配数:"<< hungary() << endl;
	return 0;
}



你可能感兴趣的:(Algorithm,C/C++)