World Final

God Medal
A very nice way to write MaxFlow via recursion
 1 #include <cstdio>
 2 #include <algorithm>
 3 #include <vector>
 4 using namespace std;
 5 typedef vector<int> vi;
 6 int N, f[300][300], c[300][300], vis[300];
 7 vi conn[300];
 8 
 9 int inc(int s, int t, int r) {
10   int rr = 0, x;
11   if (s == t) return r;
12   vis[s] = true;
13   for (vi::iterator it = conn[s].begin(); !rr && it != conn[s].end(); ++it)
14     if ((x = min(c[s][*it]-f[s][*it], r)) && !vis[*it] && (rr=inc(*it, t, x)))
15       f[s][*it] += rr, f[*it][s] -= rr;
16   return rr;
17 }
18 
19 int max_flow(int s, int t) {
20   int tot = 0, add = 0;
21   memset(f, 0sizeof(f));
22   do memset(vis, 0sizeof(vis)), add = inc(s, t, 1<<28), tot += add;
23   while (add);
24   return tot;
25 }
26 

posted on 2008-07-23 23:38  BLess  阅读(200)  评论(0编辑  收藏  举报