summaryrefslogtreecommitdiff
path: root/content/graph/kuhn.cpp
blob: 688c8462b1677f6dafee6d92b6099b0bbc027ca8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
vector<vector<int>> adj;
vector<int> pairs; // Der gematchte Knoten oder -1.
vector<bool> visited;

bool dfs(int v) {
	if (visited[v]) return false;
	visited[v] = true;
	for (int u : adj[v]) if (pairs[u] < 0 || dfs(pairs[u])) {
		pairs[u] = v; pairs[v] = u; return true;
	}
	return false;
}

int kuhn(int l) { // l = #Knoten links.
	pairs.assign(ssize(adj), -1);
	int ans = 0;
	// Greedy Matching. Optionale Beschleunigung.
	for (int v = 0; v < l; v++) for (int u : adj[v])
		if (pairs[u] < 0) {pairs[u] = v; pairs[v] = u; ans++; break;}
	for (int v = 0; v < l; v++) if (pairs[v] < 0) {
		visited.assign(l, false);
		ans += dfs(v);
	}
	return ans; // Größe des Matchings.
}