Skip to content

Commit d9d9f4d

Browse files
Merge pull request matthewsamuel95#900 from 3agwa/add-Hopkraft-Karp-to-NetworkFlow
Update NetworkFlow/Hopkraft Karp/Hopkraft Karp.cpp
2 parents 3bcc3bb + 1179506 commit d9d9f4d

File tree

1 file changed

+84
-0
lines changed

1 file changed

+84
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
const int MAXN1 = 50000;
2+
const int MAXN2 = 50000;
3+
const int MAXM = 150000;
4+
5+
int n1, n2, edges, last[MAXN1], _prev[MAXM], head[MAXM];
6+
int matching[MAXN2], dist[MAXN1], Q[MAXN1];
7+
bool used[MAXN1], vis[MAXN1];
8+
9+
void init(int _n1, int _n2)
10+
{
11+
n1 = _n1;
12+
n2 = _n2;
13+
edges = 0;
14+
fill(last, last + n1, -1);
15+
}
16+
17+
void addEdge(int u, int v)
18+
{
19+
head[edges] = v;
20+
_prev[edges] = last[u];
21+
last[u] = edges++;
22+
}
23+
24+
void bfs()
25+
{
26+
fill(dist, dist + n1, -1);
27+
int sizeQ = 0;
28+
for (int u = 0; u < n1; ++u)
29+
{
30+
if (!used[u])
31+
{
32+
Q[sizeQ++] = u;
33+
dist[u] = 0;
34+
}
35+
}
36+
for (int i = 0; i < sizeQ; i++)
37+
{
38+
int u1 = Q[i];
39+
for (int e = last[u1]; e >= 0; e = _prev[e])
40+
{
41+
int u2 = matching[head[e]];
42+
if (u2 >= 0 && dist[u2] < 0)
43+
{
44+
dist[u2] = dist[u1] + 1;
45+
Q[sizeQ++] = u2;
46+
}
47+
}
48+
}
49+
}
50+
51+
bool dfs(int u1)
52+
{
53+
vis[u1] = true;
54+
for (int e = last[u1]; e >= 0; e = _prev[e])
55+
{
56+
int v = head[e];
57+
int u2 = matching[v];
58+
if (u2 < 0 || !vis[u2] && dist[u2] == dist[u1] + 1 && dfs(u2))
59+
{
60+
matching[v] = u1;
61+
used[u1] = true;
62+
return true;
63+
}
64+
}
65+
return false;
66+
}
67+
68+
int maxMatching()
69+
{
70+
fill(used, used + n1, false);
71+
fill(matching, matching + n2, -1);
72+
for (int res = 0;;)
73+
{
74+
bfs();
75+
fill(vis, vis + n1, false);
76+
int f = 0;
77+
for (int u = 0; u < n1; ++u)
78+
if (!used[u] && dfs(u))
79+
++f;
80+
if (!f)
81+
return res;
82+
res += f;
83+
}
84+
}

0 commit comments

Comments
 (0)