国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

hihocoder #1369 : 網絡流一·Ford-Fulkerson算法

2019-11-11 05:32:46
字體:
來源:轉載
供稿:網友
時間限制:10000ms單點時限:1000ms內存限制:256MB

描述

小Hi和小Ho住在P市,P市是一個很大很大的城市,所以也面臨著一個大城市都會遇到的問題:交通擁擠。

小Ho:每到周末回家感覺堵車都是一種煎熬啊。

小Hi:平時交通也還好,只是一到上下班的高峰期就會比較擁擠。

小Ho:要是能夠限制一下車的數量就好了,不知道有沒有辦法可以知道交通系統的最大承受車流量,這樣就可以限制到一個可以一直很順暢的數量了。

小Hi:理論上是有算法的啦。早在1955年,T.E.哈里斯就提出在一個給定的網絡上尋求兩點間最大運輸量的問題。并且由此產生了一個新的圖論模型:網絡流

小Ho:那具體是啥?

小Hi:用數學的語言描述就是給定一個有向圖G=(V,E),其中每一條邊(u,v)均有一個非負數的容量值,記為c(u,v)≥0。同時在圖中有兩個特殊的頂點,源點S和匯點T。

舉個例子:

其中節點1為源點S,節點6為匯點T。

我們要求從源點S到匯點T的最大可行流量,這個問題也被稱為最大流問題

在這個例子中最大流量為5,分別為:1→2→4→6,流量為1;1→3→4→6,流量為2;1→3→5→6,流量為2。

小Ho:看上去好像挺有意思的,你讓我先想想。

提示:Ford-Fulkerson算法

 

輸入

第1行:2個正整數N,M。2≤N≤500,1≤M≤20,000。

第2..M+1行:每行3個整數u,v,c(u,v),表示一條邊(u,v)及其容量c(u,v)。1≤u,v≤N,0≤c(u,v)≤100。

給定的圖中默認源點為1,匯點為N??赡苡兄貜偷倪?。

輸出

第1行:1個整數,表示給定圖G的最大流。

樣例輸入
6 71 2 31 3 52 4 13 4 23 5 34 6 45 6 2樣例輸出
5

Edmond-Karp算法的思路其實就是Ford-Fulkerson算法。

Edmond-Karp流程:

1. 將最初的圖G轉化為殘留網絡。

2. 使用BFS反復尋找源點到匯點之間的增廣路徑。

若存在增廣路徑,對路徑上的流量進行相應修改(總流量增加,路徑上各邊容量相應減少,反向邊容量相應增加)。

3. 找不到增廣路時,當前的流量就是最大流。

#include<iostream>#include<stdio.h>using namespace std;#include<queue>#include<vector>#include<string.h>#include<algorithm>#define maxn 0x7fffffff#define MS(a,b) memset(a,b,sizeof(a))int f,PRe[6000],head[6000],vis[6000],s,t;struct node{    int u,v,next,c;}edge[60000];void add(int u,int v,int c){    edge[f].u=u;edge[f].v=v;edge[f].c=c;    edge[f].next=head[u];head[u]=f++;    edge[f].u=v;edge[f].v=u;edge[f].c=0;    edge[f].next=head[v];head[v]=f++;}int bfs(){    int i;    queue<int>q;    q.push(s);    vis[s]=1;    pre[s]=-1;   while(!q.empty())   {     int u=q.front();     q.pop();    for(i=head[u];~i;i=edge[i].next)      {          int v=edge[i].v;          if(edge[i].c>0&&!vis[v])          {              pre[v]=i;              vis[v]=1;              if(v==t)return 1;              q.push(v);          }      }   }   return 0;}int EK(){   int maxflow=0;   int flow ,i;   while(bfs())   {  MS(vis,0);       i=pre[t];       flow=maxn;       while(i!=-1)       {           flow=min(flow,edge[i].c);//每次bfs所能增加的流量。(正向邊)           i=pre[edge[i].u];       }        i=pre[t];        while(i!=-1)        {            edge[i].c-=flow;            edge[i^1].c+=flow;            i=pre[edge[i].u];        }        maxflow+=flow;   }   return maxflow;}int main(){     int n,m,i,a,b,c;     cin>>n>>m;     f=0;     MS(head,-1);     for(i=0;i<m;i++)     {         cin>>a>>b>>c;         add(a,b,c);     }     s=1;t=n;     cout<<EK()<<endl;    return 0;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 辽宁省| 元阳县| 达州市| 手机| 洛阳市| 三亚市| 苗栗市| 田林县| 曲麻莱县| 慈溪市| 龙岩市| 仙桃市| 武宁县| 三原县| 卓资县| 将乐县| 德保县| 洛隆县| 黔东| 凤山市| 额尔古纳市| 额济纳旗| 黑水县| 吉安县| 兴和县| 门源| 开封市| 建湖县| 泌阳县| 上蔡县| 永顺县| 洮南市| 文登市| 黔西县| 鸡泽县| 安阳县| 五大连池市| 南皮县| 会理县| 广宗县| 井陉县|