summaryrefslogtreecommitdiff
path: root/content/graph/kuhn.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'content/graph/kuhn.cpp')
-rw-r--r--content/graph/kuhn.cpp25
1 files changed, 25 insertions, 0 deletions
diff --git a/content/graph/kuhn.cpp b/content/graph/kuhn.cpp
new file mode 100644
index 0000000..e928387
--- /dev/null
+++ b/content/graph/kuhn.cpp
@@ -0,0 +1,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(sz(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.
+}