1 struct Edge {
2 int v, w, f;
3 int next;
4 }edge[250*250];
5 int head[550], tot;
6 void addedge(int u, int v, int w) {
7 edge[tot].v = v;
8 edge[tot].w = w;
9 edge[tot].f = 0;
10 edge[tot].next = head[u];
11 head[u] = tot++;
12 }
13 int lvl[505];
14 bool bfs(int s, int t) {
15 bool vis_t[505];
16 rst(vis_t, false);
17 lvl[s] = 0;
18 vis_t[s] = true;
19 queue<int> Q;
20 Q.push(s);
21 while(!Q.empty()) {
22 int tmp = Q.front();
23 Q.pop();
24 if(tmp == t) return true;
25 for(int i = head[tmp]; i+1; i = edge[i].next) {
26 int v = edge[i].v;
27 int f = edge[i].f;
28 int w = edge[i].w;
29 if(!vis_t[v] && f < w) {
30 Q.push(v);
31 vis_t[v] = true;
32 lvl[v] = lvl[tmp] + 1;
33 }
34 }
35 }
36 return false;
37 }
38 int dfs(int now, int t, int F) {
39 if(now == t) return F;
40 int ret = 0, ff;
41 for(int i = head[now]; i+1; i = edge[i].next) {
42 int v = edge[i].v;
43 int w = edge[i].w;
44 int f = edge[i].f;
45 if(f < w && lvl[v] == lvl[now] + 1) {
46 ff = dfs(v, t, min(F-ret, w - f));
47 edge[i].f += ff;
48 edge[i^1].f -= ff;
49 ret += ff;
50 if(ret == F) return ret;
51 }
52 }
53 return ret;
54 }
55 int dinic(int s, int t) {
56 int ans = 0;
57 while(bfs(s, t)) ans += dfs(s, t, INF);
58 return ans;
59 }
60 void init() {
61 rst(head, -1);
62 tot = 0;
63 }