summaryrefslogtreecommitdiff
path: root/content/graph/kuhn.cpp
diff options
context:
space:
mode:
authorGloria Mundi <gloria@gloria-mundi.eu>2024-11-16 18:12:15 +0100
committerGloria Mundi <gloria@gloria-mundi.eu>2024-11-16 18:12:15 +0100
commite95f59debd69ee7d45d5c966ce466d23264e1c3c (patch)
tree9b16b2c90b0c405af441db07ba406b761cca0ced /content/graph/kuhn.cpp
parentd52b0aee1e0d32c4c6f277e8291cedad2b4f1302 (diff)
rename maxCarBiMatch.cpp to kuhn.cpp
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.
+}