Advertisement
Tranvick

Dinic

Sep 26th, 2013
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <queue>
  4.  
  5. using namespace std;
  6.  
  7.  
  8. const int N = 5555;
  9. const int M = 222222;
  10. const int INF = 1000000000;
  11. int es[M], ev[M], next[M], first[N], c, n, m, d[N], s, t, ans, l[N], last[N], p, q, tmp;
  12.  
  13. void add(int x, int y, int z) {
  14.     next[++c] = first[x];
  15.     first[x] = c;
  16.     es[c] = y;
  17.     ev[c] = z;
  18. }
  19.  
  20. int be(int x) {
  21.     if (x & 1) {
  22.         return x + 1;
  23.     }
  24.     return x - 1;
  25. }
  26.  
  27. void bfs() {
  28.     queue<int> q;
  29.     q.push(s);
  30.     memset(l, 63, sizeof(l));
  31.     l[s] = 0;
  32.     while (!q.empty()) {
  33.         int v = q.front();
  34.         q.pop();
  35.         for (int h = first[v]; h; h = next[h]) {
  36.             if (l[es[h]] > l[v] + 1 && ev[h] > 0){
  37.                 l[es[h]] = l[v] + 1;
  38.                 q.push(es[h]);
  39.             }
  40.         }
  41.     }
  42. }
  43.  
  44. int dfs(int v, int f = INF) {
  45.     if (v == t) {
  46.         return f;
  47.     }
  48.     int res = 0;
  49.     if (last[v] == -1) {
  50.         last[v] = first[v];
  51.     } else {
  52.         last[v] = next[last[v]];
  53.     }
  54.     for (;last[v]; last[v] = next[last[v]]) {
  55.         int h = last[v];
  56.         if (ev[h] > 0 && l[es[h]] == l[v] + 1) {
  57.             int ans = dfs(es[h], min(ev[h], f));
  58.             ev[h] -= ans;
  59.             ev[be(h)] += ans;
  60.             res += ans;
  61.             f -= ans;
  62.             if (f == 0) break;
  63.         }
  64.     }
  65.     return res;
  66. }
  67.  
  68. int main(){
  69.     cin >> n >> p >> q;
  70.     for (int i = 1; i <= n; ++i) {
  71.         for (int j = 1; j <= n; ++j) {
  72.             cin >> tmp;
  73.             if (tmp) {
  74.                 add(i, j, 1);
  75.                 add(j, i, 0);
  76.             }
  77.         }
  78.     }
  79.     s = n + 1;
  80.     t = n + 2;
  81.     while (p--) {
  82.         cin >> tmp;
  83.         add(s, tmp, INF);
  84.         add(tmp, s, 0);
  85.     }
  86.     while (q--) {
  87.         cin >> tmp;
  88.         add(tmp, t, INF);
  89.         add(t, tmp, 0);
  90.     }
  91.     int cur;
  92.     n += 2;
  93.     do {                  
  94.         bfs();
  95.         for (int i = 1; i <= n; i++) {
  96.             last[i] = -1;
  97.         }
  98.         cur = dfs(s);      
  99.         ans += cur;
  100.     } while (cur);
  101.     cout << ans << endl;
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement