網路流最大流最小割演算法

2021-06-03 20:50:24 字數 1496 閱讀 4621

最大流演算法

不得不說網路流演算法是很讓人無語的演算法,要想高效率竟然要非遞迴實現深搜,很無奈,到現在還是在低效率中掙扎!

最大流演算法的證明就不說了,無非就是最大流最小割定理的推導,定理描述如下:

對於任意給定的網路d=(v,a,c),從出發點vs到收點vt的最大流的流量必等於分割的最小截集的容量!

至於截集,定義為:

給定網路d=(v,a,c),若點集v被分割成兩個非空集合v1和v2,使得v=v1+v2,v1∩

v2=φ(空集),且vs∈v1,vt∈v2,則把始點在v1,終點在v2的弧的集合稱為分離vs和vt的

乙個截集

然後,網路流演算法最重要的增廣鏈,正式定義為:

設 f = 是網路d=(v,a,c)上的乙個可行流,u 是從 vs到 vt的一條鏈,若u 滿足下列條件:

(1)在弧 (vi,vj)∈μ+上,即 u+中的每一條弧都是非飽和弧;

(2)在弧 (vi,vj)∈μ-上,即u- 中的每一條弧都是非零流弧。

則稱 是關於 的一條增廣鏈

最大流就是不斷的找增廣鏈,直到找不到增廣鏈為止!

樸素的有ford —— fulkerson標號法,就是每次從源點開始找增廣鏈,然後更新網路,再找增廣鏈,再更新。。。

偽**可以表示為:

void ford_fulkerson()

}另外網路流演算法多種多樣,比如dinic,有興趣可以學習學習!

**如下:

#include

#include

#include

using namespace std;

const int max = 225;

const int oo = 210000000;

int n,m,c[max][max],r[max][max],source,sink,nc,np;

int dis[max],block[max];

void initialize()// bfs建立層次圖,}}

}int dinic()

}if(flag)// 如果找到

top = source;//從新找增廣路

memset(low,0,sizeof(low));}}

else//否則阻塞當前點

if(block[source])//如果源點被阻塞了就從新建立層次圖

}return(flow);

}

網路流 最大流最小割

網路流黃頁 最大流是增廣思想的傑作,針對增光特點,採用dinic阻塞流分層 除錯編譯通過 這個沒什麼,肯定不會考裸,模板的構建是最重要的 並且還有最小割最大流定理 相等 利用拆點實現割集劃分即選與不選,放a或b1 include2 include3 include4 include5 include...

網路流 最小割最大流定理

有乙個與最大流關係密切的問題 最小割。就是把所有的頂點分成兩個集合s和t v s,其中源點s在集合s中,匯點t在集合t中。如果把 起點在s中,終點在t中 的邊都刪除,就無法從s到達t了。我們把這樣的集合劃分 s,t 成為s t割,它的容量定義為c s,t c u,v 其中u s,t t,即起點在s中...

網路流 最大流等於最小割

將網路流想象成是一張地下水管道的管道圖。而所有的在管道中流淌的水是起源同乙個點,稱這個點為源點,而這些水最終都會匯聚於同一點,這個點被稱為匯點。而每條管道都會有乙個容量上限,而這個容量是必然會大於或等於 滿載 流經這條管道的實際流量的 就好像杯子只能裝不超過杯子容量的水一樣 不管大小,從源點通過管道...