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

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

Posted on 2010-03-26 13:04 rikisand 閱讀(447) 評論(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>
            最新高清无码专区| 亚洲激情在线观看| 一本色道久久综合精品竹菊| 美脚丝袜一区二区三区在线观看 | 欧美激情一区二区三区全黄| 免费久久久一本精品久久区| 欧美mv日韩mv亚洲| 国产精品videosex极品| 国产欧美韩日| 亚洲黄色在线视频| 亚洲专区欧美专区| 免费欧美日韩| aa级大片欧美三级| 久久精品欧美日韩精品| 欧美福利视频一区| 国产伦精品一区二区三区照片91| 在线观看91精品国产麻豆| 一本综合精品| 久久精品亚洲一区二区| 久久九九99| 久久综合伊人77777| 亚洲欧洲另类| 欧美一区二区黄| 欧美片在线播放| 激情六月婷婷综合| 亚洲欧美三级在线| 亚洲成色777777女色窝| 亚洲无毛电影| 欧美精品99| 亚洲丰满少妇videoshd| 香蕉精品999视频一区二区| 欧美国产日韩在线| 欧美一区二区日韩| 国产精品美女久久久久久久| 亚洲精品国产精品乱码不99| 久久女同精品一区二区| 亚洲午夜久久久| 欧美精品福利视频| 在线不卡视频| 久久久不卡网国产精品一区| 夜久久久久久| 午夜精品亚洲一区二区三区嫩草| 蜜桃av一区| 羞羞漫画18久久大片| 欧美日产国产成人免费图片| 亚洲国产一区二区a毛片| 久久久久99| 性色一区二区三区| 国产欧美婷婷中文| 午夜精品久久久久久久| 一本色道久久88亚洲综合88| 欧美另类视频在线| 日韩午夜在线电影| 91久久国产自产拍夜夜嗨| 美女精品网站| 亚洲人成网站在线观看播放| 欧美第一黄色网| 久久综合色影院| 亚洲第一精品夜夜躁人人爽| 久久亚洲风情| 久久精品视频在线看| 国产一区二区三区视频在线观看| 久久精品99久久香蕉国产色戒| 亚洲免费影院| 国产精品视频在线观看| 欧美在线观看一区二区三区| 亚洲免费在线视频| 国产一区二区三区四区五区美女 | 亚洲一区二区三区免费观看| 日韩午夜精品| 国产精品久久久久一区二区| 午夜精品久久久久久久久久久久久 | 欧美一级成年大片在线观看| 国产曰批免费观看久久久| 久久综合给合久久狠狠色 | 欧美在线视频播放| 欧美一区二区三区喷汁尤物| 韩日精品在线| 欧美激情女人20p| 欧美精品在线观看| 亚洲免费婷婷| 久久精品99无色码中文字幕| 在线观看国产欧美| 亚洲欧洲一区二区三区| 国产精品入口| 欧美大片在线看免费观看| 欧美性色视频在线| 美国成人直播| 久久精品99国产精品酒店日本| 久久超碰97人人做人人爱| 亚洲人成在线播放| 亚洲香蕉视频| 亚洲国产精品久久久久秋霞影院| 日韩视频在线免费| 激情婷婷欧美| 一区二区日韩伦理片| 国产精品一区二区三区免费观看| 美女主播视频一区| 国产精品久久久久久久久久久久| 久久久在线视频| 欧美天堂在线观看| 亚洲第一精品夜夜躁人人躁| 欧美午夜视频| 亚洲二区三区四区| 国产午夜一区二区三区| 亚洲精品乱码| 伊甸园精品99久久久久久| 一区二区三区福利| 亚洲精品国精品久久99热| 午夜精品一区二区三区在线播放 | 久久国产88| 欧美日韩hd| 欧美激情影院| 精品成人免费| 亚洲免费一在线| 亚洲女同精品视频| 欧美精品一区二区蜜臀亚洲| 久久综合九色综合久99| 国产精品www网站| 亚洲精品免费在线播放| 最新亚洲一区| 老司机精品视频网站| 久久视频国产精品免费视频在线| 国产精品私拍pans大尺度在线| 91久久视频| 日韩视频免费观看| 欧美成人精品1314www| 欧美成人亚洲| 亚洲福利视频一区| 狂野欧美性猛交xxxx巴西| 久久躁日日躁aaaaxxxx| 久久黄色影院| 久久aⅴ国产欧美74aaa| 国产乱子伦一区二区三区国色天香| 99re6热只有精品免费观看| 9i看片成人免费高清| 欧美日韩福利| 一本色道久久综合亚洲精品婷婷 | 免费成人激情视频| 极品少妇一区二区三区精品视频| 欧美一区国产二区| 久久影音先锋| 亚洲黄色一区二区三区| 欧美国产欧美综合| 亚洲免费观看视频| 亚洲制服丝袜在线| 国产精品一级久久久| 午夜精品久久一牛影视| 久久久久网站| 亚洲人成小说网站色在线| 欧美日韩精品系列| 亚洲一区二区在线观看视频| 久久久久久国产精品mv| 亚洲福利视频三区| 欧美日韩第一区| 亚洲欧美日韩精品久久奇米色影视| 久久国产精品99久久久久久老狼| 国内成人精品视频| 美女黄毛**国产精品啪啪| 亚洲精品1区2区| 香蕉久久久久久久av网站| 国产自产精品| 欧美日韩99| 午夜亚洲性色视频| 欧美国产综合视频| 亚洲一区二区三区乱码aⅴ蜜桃女 亚洲一区二区三区乱码aⅴ | 欧美中文字幕在线| 亚洲精品国产欧美| 久久久www| 一本大道久久精品懂色aⅴ | 国产欧美一区二区三区沐欲| 欧美一区二区三区四区在线 | 亚洲第一黄网| 国产精品久久久久久久久| 美国成人直播| 亚洲一区亚洲二区| 欧美777四色影视在线| 亚洲一区二区三区四区在线观看 | 米奇777超碰欧美日韩亚洲| 国产精品99久久久久久www| 久久视频国产精品免费视频在线 | 欧美高清hd18日本| 午夜在线a亚洲v天堂网2018| 在线观看久久av| 国产精品拍天天在线| 欧美成人tv| 久久精品免费看| 亚洲视频免费在线| 在线观看一区欧美| 国产精品自在线| 欧美日韩精品一区二区| 久久噜噜噜精品国产亚洲综合| 亚洲天堂免费在线观看视频| 91久久久久久国产精品| 嫩草国产精品入口| 久久久久久亚洲精品杨幂换脸 | 亚洲一二三区精品| 亚洲国产婷婷香蕉久久久久久| 国产视频一区二区在线观看 | 国产欧美日韩精品a在线观看|