网络流 dinic

 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 }

 

posted @ 2015-04-19 21:52  Mite  阅读(148)  评论(0)    收藏  举报