EntropyIncreaser

flow with bound

Jan 24th, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.90 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3.  
  4. #include <algorithm>
  5. #include <queue>
  6.  
  7. using namespace std;
  8.  
  9. struct edge {
  10.     int v, w;
  11.     edge *next, *rev;
  12. };
  13.  
  14. const int N = 210, M = 10210, S = 0, T = N - 1, INF = 1e8;
  15.  
  16. static edge pool[2 * (N + M)];
  17.  
  18. int n, m;
  19. int d[N], level[N];
  20. int l[M];
  21. bool vis[N];
  22. edge* g[N];
  23.  
  24. edge* add_edge(int u, int v, int w);
  25. void link(int u, int v, int w);
  26. int dinic();
  27. bool bfs();
  28. int dfs(int u, int lim);
  29.  
  30. int main() {
  31.     int expected = 0;
  32.     scanf("%d%d", &n, &m);
  33.     for (int i = 1; i <= m; ++i) {
  34.         int u, v, r;
  35.         scanf("%d%d%d%d", &u, &v, &l[i], &r);
  36.         r -= l[i];
  37.         d[u] += l[i];
  38.         d[v] -= l[i];
  39.         link(u, v, r);
  40.     }
  41.     for (int i = 1; i <= n; ++i)
  42.         if (d[i] > 0) {
  43.             expected += d[i];
  44.             link(i, T, d[i]);
  45.         } else if (d[i] < 0)
  46.             link(S, i, -d[i]);
  47.     if (dinic() == expected) {
  48.         puts("YES");
  49.         for (int i = 1; i <= m; ++i)
  50.             printf("%d\n", pool[i * 2 - 1].w + l[i]);
  51.     } else
  52.         puts("NO");
  53.     return 0;
  54. }
  55.  
  56. int dinic() {
  57.     int ret = 0;
  58.     while (bfs())
  59.         ret += dfs(S, INF);
  60.     return ret;
  61. }
  62.  
  63. bool bfs() {
  64.     memset(vis, 0, sizeof(vis));
  65.     queue<int> q;
  66.     q.push(S);
  67.     while (!q.empty()) {
  68.         int u = q.front();
  69.         q.pop();
  70.         vis[u] = true;
  71.         for (edge* p = g[u]; p; p = p->next)
  72.             if (!vis[p->v] && p->w) {
  73.                 level[p->v] = level[u] + 1;
  74.                 q.push(p->v);
  75.             }
  76.     }
  77.     return vis[T];
  78. }
  79.  
  80. int dfs(int u, int lim) {
  81.     if (u == T)
  82.         return lim;
  83.     int ret = 0;
  84.     for (edge* p = g[u]; p && lim; p = p->next)
  85.         if (level[u] < level[p->v] && p->w) {
  86.             int f = dfs(p->v, min(lim, p->w));
  87.             lim -= f;
  88.             p->w -= f;
  89.             p->rev->w += f;
  90.             ret += f;
  91.         }
  92.     if (!ret)
  93.         level[u] = -1;
  94.     return ret;
  95. }
  96.  
  97. void link(int u, int v, int w) {
  98.     edge *p = add_edge(u, v, w);
  99.     edge *q = add_edge(v, u, 0);
  100.     p->rev = q;
  101.     q->rev = p;
  102. }
  103.  
  104. edge* add_edge(int u, int v, int w) {
  105.     static edge* p = pool;
  106.     p->v = v;
  107.     p->w = w;
  108.     p->next = g[u];
  109.     g[u] = p;
  110.     return p++;
  111. }
Advertisement
Add Comment
Please, Sign In to add comment