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

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

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

2019-11-11 04:45:20
字體:
來源:轉載
供稿:網友
時間限制: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;}
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 东城区| 广昌县| 家居| 苏尼特左旗| 怀安县| 镶黄旗| 特克斯县| 泰兴市| 新龙县| 库伦旗| 金门县| 秭归县| 凤翔县| 耿马| 巴中市| 万盛区| 济宁市| 基隆市| 万安县| 大安市| 合阳县| 江源县| 沧源| 新田县| 阜康市| 平远县| 房产| 黄梅县| 钟山县| 洛扎县| 甘德县| 武邑县| 木兰县| 兰溪市| 平乡县| 翁源县| 新津县| 高台县| 莱州市| 南宁市| 象州县|