1
- struct edge {int a, b , c, f;};
1
+ struct edge {int v , c, f;};
2
2
3
3
int n, s, t, h[N], ptr[N];
4
4
vector<edge> e;
5
5
vector<int > g[N];
6
6
7
7
void add_edge (int a, int b, int c) {
8
8
int k = e.size ();
9
- e.push_back ({a, b, c, 0 });
10
- e.push_back ({b, a, 0 , 0 });
9
+ e.push_back ({b, c, 0 });
10
+ e.push_back ({a, 0 , 0 });
11
11
g[a].push_back (k);
12
12
g[b].push_back (k+1 );
13
13
}
14
14
15
15
bool bfs () {
16
- memset (h, 63 , sizeof (h) );
16
+ memset (h, 0 , n * sizeof h[ 0 ] );
17
17
queue<int > q;
18
- q.push (s);
19
18
h[s] = 0 ;
19
+ q.push (s);
20
20
while (!q.empty ()) {
21
21
int u = q.front (); q.pop ();
22
22
for (int i : g[u]) {
23
- int v = e[i].b ;
24
- if (e[i].f < e[i].c )
23
+ int v = e[i].v ;
24
+ if (h[v] < 0 and e[i].f < e[i].c )
25
25
q.push (v), h[v] = h[u] + 1 ;
26
26
}
27
27
}
@@ -31,12 +31,12 @@ bool bfs() {
31
31
int dfs (int u, int flow) {
32
32
if (!flow) return 0 ;
33
33
if (u == t) return flow;
34
- for (int & i = ptr[u]; i < g[u].size (); ++i) {
35
- edge& dir = e[g[u][i]], rev = e[g[u][i^1 ]];
36
- int v = dir.b ;
37
-
34
+ for (int &i = ptr[u]; i < g[u].size (); ++i) {
35
+ edge &dir = e[g[u][i]], &rev = e[g[u][i]^1 ];
36
+ int v = dir.v ;
38
37
if (h[v] != h[u] + 1 ) continue ;
39
- int inc = dfs (v, min (flow, dir.c - dir.f ));
38
+ int inc = min (flow, dir.c - dir.f );
39
+ inc = dfs (v, inc);
40
40
if (inc) {
41
41
dir.f += inc, rev.f -= inc;
42
42
return inc;
@@ -48,7 +48,7 @@ int dfs (int u, int flow) {
48
48
int dinic () {
49
49
int flow = 0 ;
50
50
while (bfs ()) {
51
- memset (ptr, 0 , n * sizeof ptr[0 ]);
51
+ memset (ptr, 0 , n * sizeof ptr[0 ]);
52
52
while (int inc = dfs (s, INF)) flow += inc;
53
53
}
54
54
return flow;
0 commit comments