summaryrefslogtreecommitdiff
path: root/graph/hopcroftKarp.cpp
diff options
context:
space:
mode:
authormzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
committermzuenni <michi.zuendorf@gmail.com>2022-06-27 17:19:28 +0200
commit5ab8a5088b729a9953b8dff1b2a985dc8fb2098b (patch)
treeed40d6936c0e9eee40ba62751cbf99ecddbaddc2 /graph/hopcroftKarp.cpp
parentadabbad9c51cf7cd3874bfde8eac1fbcf84fec10 (diff)
updated tcr
Diffstat (limited to 'graph/hopcroftKarp.cpp')
-rw-r--r--graph/hopcroftKarp.cpp71
1 files changed, 34 insertions, 37 deletions
diff --git a/graph/hopcroftKarp.cpp b/graph/hopcroftKarp.cpp
index 629ebf7..132b249 100644
--- a/graph/hopcroftKarp.cpp
+++ b/graph/hopcroftKarp.cpp
@@ -1,46 +1,43 @@
-// Laufzeit: O(sqrt(|V|)*|E|)
-// Kanten von links nach rechts.
-// 0: dummy Knoten, 1..n: linke Knoten, n+1..n+m: rechte Knoten
vector<vector<int>> adjlist;
-vector<int> match, dist;
+// pairs ist der gematchte Knoten oder -1
+vector<int> pairs, dist;
bool bfs(int n) {
- queue<int> q;
- dist[0] = INF;
- for(int i = 1; i <= n; i++) {
- if(match[i] == 0) { dist[i] = 0; q.push(i); }
- else dist[i] = INF;
- }
- while(!q.empty()) {
- int u = q.front(); q.pop();
- if(dist[u] < dist[0]) for (int v : adjlist[u])
- if(dist[match[v]] == INF) {
- dist[match[v]] = dist[u] + 1;
- q.push(match[v]);
- }
- }
- return dist[0] != INF;
+ queue<int> q;
+ for(int i = 0; i < n; i++) {
+ if (pairs[i] < 0) {dist[i] = 0; q.push(i);}
+ else dist[i] = -1;
+ }
+ while(!q.empty()) {
+ int u = q.front(); q.pop();
+ for (int v : adjlist[u]) {
+ if (pairs[v] < 0) return true;
+ if (dist[pairs[v]] < 0) {
+ dist[pairs[v]] = dist[u] + 1;
+ q.push(pairs[v]);
+ }}}
+ return false;
}
bool dfs(int u) {
- if(u != 0) {
- for (int v : adjlist[u])
- if(dist[match[v]] == dist[u] + 1)
- if(dfs(match[v])) { match[v] = u; match[u] = v; return true; }
- dist[u] = INF;
- return false;
- }
- return true;
+ for (int v : adjlist[u]) {
+ if (pairs[v] < 0 ||
+ (dist[pairs[v]] > dist[u] && dfs(pairs[v]))) {
+ pairs[v] = u; pairs[u] = v;
+ return true;
+ }}
+ dist[u] = -1;
+ return false;
}
int hopcroft_karp(int n) { // n = #Knoten links
- int ans = 0;
- match.assign(adjlist.size(), 0);
- dist.resize(adjlist.size());
- // Greedy Matching, optionale Beschleunigung.
- for (int i = 1; i <= n; i++) for (int w : adjlist[i])
- if (match[w] == 0) { match[i] = w; match[w] = i; ans++; break; }
- while(bfs(n)) for(int i = 1; i <= n; i++)
- if(match[i] == 0 && dfs(i)) ans++;
- return ans;
-}
+ int ans = 0;
+ pairs.assign(sz(adjlist), -1);
+ dist.resize(n);
+ // Greedy Matching, optionale Beschleunigung.
+ for (int i = 0; i < n; i++) for (int w : adjlist[i])
+ if (pairs[w] < 0) {pairs[i] = w; pairs[w] = i; ans++; break;}
+ while(bfs(n)) for(int i = 0; i < n; i++)
+ if (pairs[i] < 0) ans += dfs(i);
+ return ans;
+} \ No newline at end of file