匈牙利算法

#算法

匈牙利算法是解决二分图中最大边匹配(即最小点覆盖)的一种高效算法,时间复杂度为O(VE) (点边乘积)

  • 最大边匹配: 在图中选取尽可能多的边,使得这些边之间没有公共顶点
  • 最小点覆盖: 覆盖所有边所需要最少的点(边上两点之一被选中该边即视为被覆盖)
  • 匈牙利算法的核心: dfs不断寻找增广路径判断是否可以匹配

C++算法:

//code by homgzha
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, k;
const int N = 505;
int st[N];
int match[N];
int g[N][N];
bool dfs(int u) {
	for (int i = 0;i < N;i++) {
		if (g[u][i] && !st[i]) {
			st[i] = 1;
			if (!match[i] || dfs(match[i])) {
				match[i] = u;return true;
			}
		}
	}
	return false;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	while (cin >> k >> m >> n) {
		memset(g, 0, sizeof g);
		memset(match, 0, sizeof match);
		int x, y;
		while (k--) {
			cin >> x >> y;
			g[x][y] = 1;
		}
		int ans = 0;
		for (int i = 1;i <= m;i++) {
			memset(st, 0, sizeof st);
			if (dfs(i))ans++;
		}
		cout << ans << endl;
	}
	return 0;
}


联系方式 - 如果你 喜欢 我的话~

GitHubbilibiliCSDN

ZHM