青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

USACO 4.2.2 第一道網絡流····

Posted on 2010-03-26 13:04 rikisand 閱讀(453) 評論(0)  編輯 收藏 引用 所屬分類: C/C++USACO

Drainage Ditches
Hal Burch

Every time it rains on Farmer John's fields, a pond forms over Bessie's favorite clover patch. This means that the clover is covered by water for awhile and takes quite a long time to regrow. Thus, Farmer John has built a set of drainage ditches so that Bessie's clover patch is never covered in water. Instead, the water is drained to a nearby stream. Being an ace engineer, Farmer John has also installed regulators at the beginning of each ditch, so he can control at what rate water flows into that ditch.

Farmer John knows not only how many gallons of water each ditch can transport per minute but also the exact layout of the ditches, which feed out of the pond and into each other and stream in a potentially complex network. Note however, that there can be more than one ditch between two intersections.

Given all this information, determine the maximum rate at which water can be transported out of the pond and into the stream. For any given ditch, water flows in only one direction, but there might be a way that water can flow in a circle.

PROGRAM NAME: ditch
INPUT FORMAT

Line 1:
Two space-separated integers, N (0 <= N <= 200) and M (2 <= M <= 200). N is the number of ditches that Farmer John has dug. M is the number of intersections points for those ditches. Intersection 1 is the pond. Intersection point M is the stream.

Line 2..N+1:
Each of N lines contains three integers, Si, Ei, and Ci. Si and Ei (1 <= Si, Ei <= M) designate the intersections between which this ditch flows. Water will flow through this ditch from Si to Ei. Ci (0 <= Ci <= 10,000,000) is the maximum rate at which water will flow through the ditch.

SAMPLE INPUT (file ditch.in)
5 4
1 2 40
1 4 20
2 4 20
2 3 30
3 4 10
OUTPUT FORMAT

One line with a single integer, the maximum rate at which water may emptied from the pond.

SAMPLE OUTPUT (file ditch.out)
50
最基本的網絡流
   1:  #include<iostream>
   2:  #include<fstream>
   3:  #include<string>
   4:  #include<vector>
   5:  #include<map>
   6:  #include<algorithm>
   7:  #include<sstream>
   8:  #include <cstring>
   9:  #include <queue>
  10:  using namespace std;
  11:  const int MAXN = 220;
  12:  const int infi = 0x7FFFFFFF;
  13:   int capacity[MAXN][MAXN], prenode[MAXN], flow[MAXN];
  14:   queue<int> mq; 
  15:   
  16:  int start, end, N;
  17:  void init(){
  18:      freopen("ditch.in","r",stdin);
  19:      //freopen("e:\\usaco\\ditch.in","r",stdin);
  20:      start = 1;  
  21:      scanf("%d %d",&N,&end); int c, s, t;
  22:      memset(capacity,0,sizeof(capacity));
  23:      for(int i=0;i<N;i++)
  24:      {
  25:          scanf("%d %d %d",&c,&s,&t);
  26:          capacity[c][s] += t; //兩個節點間不只有一條路
  27:      } 
  28:  }
  29:  int bfs(){//尋找增廣路徑
  30:      while(!mq.empty()) mq.pop(); 
  31:      mq.push(start);  //源節點入隊
  32:      //memset(flow,0,sizeof(flow));
  33:      memset(prenode,-1,sizeof(prenode)); //重置前向節點
  34:      prenode[start] = 0; flow[start]=infi; //源節點流量無限大
  35:      while(!mq.empty()){
  36:          int cur = mq.front(); 
  37:          mq.pop();
  38:          if(cur == end) break; //到達匯點結束路徑 
  39:          for(int i=1;i<=end;i++){ 
  40:              if(prenode[i]==-1 && capacity[cur][i]) //訪問當前節點所有未訪問的相鄰節點,更新flow
  41:              {
  42:                  prenode[i] = cur;
  43:                  flow[i] = (flow[cur]<capacity[cur][i]?flow[cur]:capacity[cur][i]);
  44:                  mq.push(i);
  45:              }
  46:          }
  47:      }
  48:      if(prenode[end]==-1)  //如果未找到增廣路徑返回-1
  49:          return -1;
  50:      return flow[end];
  51:  }
  52:  int Edmonds_Karp(){
  53:      int total = 0, pathcapacity;//pathcapacity 路徑增加量
  54:      while((pathcapacity = bfs()) != -1){//可以找到增廣路徑時候進行循環
  55:          int cur = end;    //從匯點開始增加逆向節點
  56:          while( cur != start ){
  57:              int t = prenode[cur] ;
  58:              capacity[t][cur] -= pathcapacity;
  59:              capacity[cur][t] += pathcapacity;
  60:              cur = t;
  61:          }
  62:          total += pathcapacity;//max_flow
  63:      }
  64:      return total;
  65:  }
  66:  void output(){
  67:      freopen("ditch.out","w",stdout);
  68:      //freopen("c:\\usaco\\ditch.out","w",stdout);
  69:      cout<<Edmonds_Karp()<<endl;
  70:  } 
  71:     int main()
  72:  {
  73:      init();  
  74:      output();
  75:      return 0;
  76:  }

標程:使用貪心法,尋找一條增廣路徑的時候不斷尋找cap最大的,未被訪問的節點mloc;然后更新跟mloc相鄰的節點flow以

及prenode信息.最后當運行到end時候,更新路徑節點capacity,同時增加max_flow.重復上述過程直到找不到增廣路徑

   1:  #include <stdio.h>
   2:  #include <string.h>
   3:   
   4:  #define MAXI 200
   5:   
   6:  /* total drain amount between intersection points */
   7:  int drain[MAXI][MAXI];
   8:  int nint; /* number of intersection points */
   9:   
  10:  int cap[MAXI]; /* amount of flow that can get to each node */
  11:  int vis[MAXI]; /* has this node been visited by Dijkstra's yet? */
  12:  int src[MAXI]; /* the previous node on the path from the source to here */
  13:   
  14:  int augment(void)
  15:   { /* run a Dijkstra's varient to find maximum augmenting path */
  16:    int lv;
  17:    int mloc, max;
  18:    int t;
  19:   
  20:    memset(cap, 0, sizeof(cap));
  21:    memset(vis, 0, sizeof(vis));
  22:   
  23:    cap[0] = 2000000000;
  24:    while (1)
  25:     {
  26:      /* find maximum unvisited node */
  27:      max = 0;
  28:      mloc = -1;
  29:      for (lv = 0; lv < nint; lv++)
  30:        if (!vis[lv] && cap[lv] > max)
  31:         {
  32:          max = cap[lv];
  33:      mloc = lv;
  34:         }
  35:      if (mloc == -1) return 0;
  36:      if (mloc == nint-1) break; /* max is the goal, we're done */
  37:   
  38:      vis[mloc] = -1; /* mark as visited */
  39:   
  40:      /* update neighbors, if going through this node improves the
  41:         capacity */
  42:      for (lv = 0; lv < nint; lv++)
  43:        if (drain[mloc][lv] > cap[lv] && max > cap[lv])
  44:         {
  45:          cap[lv] = drain[mloc][lv];
  46:      if (cap[lv] > max) cap[lv] = max;
  47:      src[lv] = mloc;
  48:         }
  49:     }
  50:    max = cap[nint-1];
  51:   
  52:    /* augment path, starting at end */
  53:    for (lv = nint-1; lv > 0; lv = src[lv])
  54:     {
  55:      t = src[lv];
  56:      drain[t][lv] -= max;
  57:      drain[lv][t] += max;
  58:     }
  59:    return max;
  60:   }
  61:   
  62:  int main(int argc, char **argv)
  63:   {
  64:    FILE *fout, *fin;
  65:    int lv;
  66:    int num;
  67:    int p1, p2, c;
  68:   
  69:    if ((fin = fopen("ditch.in", "r")) == NULL)
  70:     {
  71:      perror ("fopen fin");
  72:      exit(1);
  73:     }
  74:    if ((fout = fopen("ditch.out", "w")) == NULL)
  75:     {
  76:      perror ("fopen fout");
  77:      exit(1);
  78:     }
  79:   
  80:    fscanf (fin, "%d %d", &num, &nint);
  81:    while (num--)
  82:     {
  83:      fscanf (fin, "%d %d %d", &p1, &p2, &c);
  84:      p1--;
  85:      p2--;
  86:      drain[p1][p2] += c; /* note += handles two ditches between same points */
  87:     }
  88:   
  89:    /* max flow algorithm: augment while you can */
  90:    c = 0;
  91:    while ((p1 = augment()))
  92:      c += p1;
  93:    fprintf (fout, "%d\n", c);
  94:    return 0;
  95:   }

 

 

 

 

 

 

 

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产揄拍国内精品对白| 国产精品sss| 亚洲国产色一区| 蜜桃久久av一区| 久久免费视频一区| 亚洲娇小video精品| 91久久精品视频| 欧美精品情趣视频| 在线亚洲精品| 亚洲欧美日韩在线不卡| 极品裸体白嫩激情啪啪国产精品| 米奇777超碰欧美日韩亚洲| 久热精品视频在线| 一本色道精品久久一区二区三区| 99xxxx成人网| 国产亚洲一区二区三区| 欧美成人中文字幕在线| 欧美日韩网址| 久久精品亚洲一区二区| 久久米奇亚洲| 亚洲影院污污.| 久久精品免费观看| 亚洲伦理在线观看| 亚洲综合色网站| 亚洲人成在线影院| 亚洲欧美一区二区原创| 亚洲福利精品| 亚洲免费中文字幕| 亚洲精品在线观看视频| 亚洲在线观看视频网站| 亚洲国产精品va在线看黑人动漫| 夜夜嗨网站十八久久| 黑人操亚洲美女惩罚| 亚洲人被黑人高潮完整版| 欧美私人网站| 欧美黑人在线播放| 国产精品男女猛烈高潮激情| 免费欧美日韩国产三级电影| 欧美性色视频在线| 免费日韩av片| 国产一区二区三区奇米久涩| 亚洲日本成人在线观看| 一区精品久久| 午夜久久久久久| 亚洲在线观看| 欧美电影在线观看| 久久午夜视频| 国产日韩亚洲欧美精品| 日韩视频专区| 亚洲另类春色国产| 久久久久久久久久码影片| 亚洲欧美精品suv| 欧美激情综合五月色丁香| 女女同性女同一区二区三区91| 国产精品欧美日韩一区| 日韩一区二区高清| 亚洲精品一区二区网址 | 制服丝袜亚洲播放| 久久综合图片| 欧美freesex交免费视频| 国产一区二区三区直播精品电影 | 久久久精品一区| 国产精品久久久久久久第一福利| 亚洲精品一区在线观看香蕉| 最新日韩av| 欧美激情国产日韩精品一区18| 欧美成人综合网站| 亚洲国产精品悠悠久久琪琪| 久久久久久久一区二区三区| 久久亚洲视频| 激情av一区| 久热精品视频在线| 欧美高清在线一区二区| 最新国产成人av网站网址麻豆| 久久久久九九视频| 欧美成人黑人xx视频免费观看| 在线观看日韩国产| 老司机精品导航| 亚洲日本电影| 亚洲欧美综合一区| 国产欧美日韩另类视频免费观看| 欧美一区二区三区另类| 麻豆精品精品国产自在97香蕉| 1204国产成人精品视频| 美女主播一区| 日韩视频一区二区| 欧美中文字幕精品| 亚洲国产精品va在线观看黑人| 欧美ed2k| 亚洲在线电影| 欧美福利电影网| 一区二区三区四区国产精品| 国产精品日韩一区二区| 久久九九精品99国产精品| 亚洲国产激情| 亚洲欧美色婷婷| 极品少妇一区二区三区精品视频| 牛牛精品成人免费视频| 妖精成人www高清在线观看| 欧美在线影院在线视频| 亚洲国产日韩精品| 国产精品a级| 久久精品亚洲精品| 99精品视频免费全部在线| 久久精品在线| 一区二区三区导航| 狠狠色狠色综合曰曰| 欧美精品电影| 久久精品国产精品亚洲综合| 日韩视频第一页| 欧美成人激情在线| 亚洲综合不卡| 亚洲精品国产日韩| 国产亚洲亚洲| 国产精品va在线播放| 久久综合99re88久久爱| 亚洲免费人成在线视频观看| 欧美黄色aaaa| 久久久人成影片一区二区三区观看 | 亚洲国产三级在线| 久久精品视频免费播放| 一区二区三区日韩| 亚洲国产精品久久久久婷婷884| 国产精品成人免费| 欧美激情第10页| 老色批av在线精品| 久久成人这里只有精品| 亚洲影院色在线观看免费| 亚洲国产你懂的| 免费亚洲一区| 久久一区二区三区av| 欧美在线关看| 亚洲影视在线播放| 夜夜嗨网站十八久久| 最近看过的日韩成人| 伊人色综合久久天天| 国产亚洲精品久| 国产精品手机视频| 国产精品久久久久免费a∨| 欧美日韩国产va另类| 欧美成人午夜影院| 欧美电影资源| 美女图片一区二区| 女仆av观看一区| 欧美国产日韩一区| 欧美国产日韩一区二区三区| 蜜桃av噜噜一区| 欧美黑人国产人伦爽爽爽| 麻豆成人av| 欧美精品一区二| 欧美日本一区二区三区| 欧美另类视频| 欧美视频第二页| 国产精品久久久久秋霞鲁丝| 国产精品亚洲综合天堂夜夜| 国产精品免费一区二区三区观看 | 久久尤物电影视频在线观看| 久久久国产精品一区| 久久天天躁狠狠躁夜夜av| 久久综合精品一区| 欧美屁股在线| 国产精品久久久久永久免费观看 | 老司机免费视频久久| 免费成人美女女| 欧美精品自拍| 国产精品免费看| 狠狠综合久久| 亚洲日本免费| 亚洲欧美日本日韩| 久久香蕉国产线看观看av| 免费人成精品欧美精品| 亚洲人成网在线播放| 亚洲一区综合| 久久亚洲精品一区| 欧美日韩123| 国产一区二区久久久| 亚洲欧洲在线视频| 亚洲免费中文| 欧美电影免费| 亚洲一区二区影院| 狂野欧美激情性xxxx欧美| 欧美日韩亚洲综合| 国产亚洲午夜| 亚洲网站在线观看| 乱码第一页成人| 一区二区三区久久网| 久久影视三级福利片| 国产精品黄色| 亚洲区一区二| 久久精品人人做人人综合| 亚洲精品一级| 久久久亚洲一区| 国产精品成人久久久久| 亚洲国产一区二区三区a毛片| 亚洲自拍啪啪| 亚洲激情视频| 久久一区激情| 国产私拍一区| 亚洲一区网站| 亚洲精品乱码久久久久久按摩观|