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.
}
|