- 两篇参考网址
- 增广路径:非匹配边->匹配边->非匹配边组成的路径
- 递归:将之前匹配边的女生赋给新的男生,之前匹配边的男生重新找到心仪的女生,如此递归。
#include <iostream>
#include <fstream>
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;
}