zoukankan      html  css  js  c++  java
  • Cogs 12 运输问题2 (有上下界网络流)

      1 #include <cstdlib>
      2 #include <algorithm>
      3 #include <cstring>
      4 #include <iostream>
      5 #include <cstdio>
      6 #include <vector>
      7 
      8 using namespace std;
      9 
     10 const int N = 100 +  5;
     11 const int oo = 0x3f3f3f3f;
     12 
     13 struct Edge {
     14   int from, to, cap, flow;
     15 };
     16 
     17 struct Dinic {
     18   int n, m, s, t;
     19   int dis[N], cur[N], que[N << 1];
     20   bool vis[N];
     21   vector <Edge> edges;
     22   vector <int> G[N];
     23 
     24   void add(int from, int to, int cap) {
     25     edges.push_back((Edge) {from, to, cap, 0});
     26     edges.push_back((Edge) {to, from, 0, 0});
     27     m = edges.size();
     28     G[from].push_back(m - 2);
     29     G[to].push_back(m - 1);
     30   }
     31 
     32   bool bfs() {
     33     int head = 1, tail = 1;
     34 
     35     memset(vis, false, sizeof vis);
     36     dis[s] = 0; vis[s] = true; que[head] = s;
     37     while(head <= tail) {
     38       int x = que[head];
     39 
     40       for(int i = 0; i < (signed) G[x].size(); ++ i) {
     41         Edge &e = edges[G[x][i]];
     42 
     43         if(!vis[e.to] && e.cap > e.flow) {
     44           vis[e.to] = true;
     45           dis[e.to] = dis[x] + 1;
     46           que[++ tail] = e.to;
     47         }
     48       }
     49       ++ head;
     50     }
     51     return vis[t];
     52   }
     53 
     54   int dfs(int x, int a) {
     55     if(x == t || a == 0) return a;
     56 
     57     int flw = 0, f;
     58 
     59     for(int &i = cur[x]; i < (signed) G[x].size(); ++ i) {
     60       Edge &e = edges[G[x][i]];
     61       
     62       if(dis[e.to] == dis[x] + 1 && (f = dfs(e.to, min(a, e.cap - e.flow))) > 0) {
     63         e.flow += f; edges[G[x][i] ^ 1].flow -= f; flw += f; a -= f;
     64         if(a == 0) break;
     65       }
     66     }
     67     return flw;
     68   }
     69 
     70   int MaxFlow(int s, int t) {
     71     this->s = s; this->t = t;
     72 
     73     int flw = 0;
     74 
     75     while(bfs()) {
     76       memset(cur, 0, sizeof cur);
     77       flw += dfs(s, oo);
     78     }
     79     return flw;
     80   }
     81 }net;
     82 
     83 int n, M[N];
     84 
     85 int main() {
     86 #ifndef ONLINE_JUDGE
     87   freopen("maxflowb.in", "r", stdin);
     88   freopen("maxflowb.out", "w", stdout);
     89 #endif
     90 
     91   int Up, Down;
     92   
     93   scanf("%d", &n); net.n = n + 1;
     94   for(int i = 1; i <= n; ++ i) {
     95     for(int j = 1; j <= n; ++ j) {
     96       scanf("%d%d", &Down, &Up);
     97       M[i] -= Down; M[j] += Down;
     98       net.add(i, j, Up - Down);
     99     }
    100   }
    101   net.add(n, 1, oo);
    102   for(int i = 1; i <= n; ++ i) {
    103     if(M[i] > 0) {
    104       net.add(0, i, M[i]);
    105     }
    106     else if(M[i] < 0){
    107       net.add(i, n + 1, -M[i]);
    108     }
    109   }
    110   net.MaxFlow(0, n + 1);
    111   printf("%d
    ", net.MaxFlow(1, n));
    112   
    113 #ifndef ONLINE_JUDGE
    114   fclose(stdin); fclose(stdout);
    115 #endif
    116   return 0;
    117 }
    Cogs 12

    连边方式见图。

  • 相关阅读:
    JavaScript 学习笔记 事件二
    auto_ptr
    POJ2299 UltraQuickSort(逆序对个数)
    2016年11月2日22:28:14
    将sql server中的数据倒入Excel(c#)
    线段树成段更新裸题POJ3468
    线段树成断更新裸题hdu1698 Just a Hook
    POJ2828 思维难度较好的一道线段树
    < 弱牛刷贪心给JerryDung&qiuwei大神Orz>最大乘积
    NOIP 2008 传纸条题解[双线程DP]
  • 原文地址:https://www.cnblogs.com/sxprovence/p/5284963.html
Copyright © 2011-2022 走看看