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 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 }