Tranvick

Min_cost_flow(Opencup)

Apr 8th, 2013
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.88 KB | None | 0 0
  1. #include <algorithm>
  2. #include <cstdio>
  3.  
  4. using namespace std;
  5.  
  6. const int INF = 1000000000, N = 222, M = 111111;
  7. int n, m, first[N], next[M], ev[M], ec[M], es[M], S, T, ef[M], from[N], edge[N], d[N], c;
  8.  
  9. void add(int x, int y, int z, int co) {
  10.     next[++c] = first[x]; first[x] = c;
  11.     ef[c] = x; es[c] = y; ev[c] = z; ec[c] = -co;
  12. }
  13.  
  14. int be(int x) {
  15.     if (x & 1) return x + 1;
  16.     return x - 1;
  17. }
  18.  
  19. void clear_graph() {
  20.     for (int i = 0; i <= T; ++i) first[i] = from[i] = edge[i] = 0;
  21.     for (int i = 0; i <= c; ++i) ef[i] = ev[i] = ec[i] = es[i] = next[i] = 0;
  22.     c = 0;
  23. }
  24.  
  25. void fb() {
  26.     for (int i = 1; i <= T; ++i) d[i] = INF;  
  27.     d[S] = 0;
  28.     for (int i = 1; i <= T; ++i) {
  29.         bool ch = false;
  30.         for (int j = 1; j <= c; ++j) {
  31.             if (ev[j] && d[es[j]] > d[ef[j]] + ec[j] && d[ef[j]] != INF) {
  32.                 d[es[j]] = d[ef[j]] + ec[j];
  33.                 from[es[j]] = ef[j];
  34.                 edge[es[j]] = j;
  35.                 ch = true;
  36.             }
  37.         }
  38.         if (!ch) break;
  39.     }
  40. }
  41.  
  42. int solve() {
  43.     int res = 0;
  44.     while (1) {
  45.         fb();
  46.         if (d[T] == INF) break;
  47.         for (int v = T; v != S; v = from[v]) {
  48.             --ev[edge[v]];
  49.             ++ev[be(edge[v])];
  50.         }
  51.         res += d[T];
  52.     }
  53.     return -res;
  54. }
  55.  
  56. int main() {
  57.     while (1) {
  58.         scanf("%d%d",&n, &m);
  59.         if (n == 0) break;
  60.         clear_graph();
  61.         S = n + m + 1;
  62.         T = n + m + 2;
  63.         for (int i = 1; i <= n; ++i) {
  64.             int x;
  65.             scanf("%d", &x);
  66.             add(m + i, T, x, 0);
  67.             add(T, m + i, 0 ,0);
  68.         }
  69.         for (int i = 1; i <= m; ++i) {
  70.             add(S, i, 1, 0);
  71.             add(i, S, 0, 0);
  72.         }
  73.         for (int i = 1; i <= m; ++i) {
  74.             int y, c1, c2, c3, c4;
  75.             scanf("%d%d%d%d%d", &y, &c1, &c2, &c3, &c4);
  76.             ++c1;++c2;++c3;++c4;
  77.             int f = y * 4;
  78.             add(i, m + c1, 1, f);
  79.             add(m + c1, i, 0, -f);
  80.             add(i, m + c2, 1, f - 1);
  81.             add(m + c2, i, 0, -f + 1);
  82.             add(i, m + c3, 1, f - 2);
  83.             add(m + c3, i, 0, -f + 2);
  84.             add(i, m + c4, 1, f - 3);
  85.             add(m + c4, i, 0, -f + 3);
  86.         }
  87.         printf("%d\n", solve());
  88.     }
  89.     return 0;
  90. }
Advertisement
Add Comment
Please, Sign In to add comment