@[網路流——最大流——dinic演算法的初步認識]
!!!!!!!目前部落格轉移 !!!
簡單說一說:有乙個起點(源點),和乙個終點(匯點),它們之間用很多直徑大小不一的管子連在一起,為什麼要用大小不一的管子,(假如這些都是水管),那麼你要做的就是:算出從源點到匯點最大可以流入多少水。
顯然,對於一條路上,它的最大流是這條路上直徑最小的管子所能承受的水量(再多的話,那最小的水管就爆了)。 於是乎,直徑最小的水管就被佔滿了——不能再有更多的水從這裡通過,而直徑比它大的管子還沒被佔滿——所以他們還可以再讓更多的水通過。
大概就這麼個意思_如下圖
最後,把所有到達匯點的水量加起來就行了。
直接上**!!!
#include
using
namespace std;
const
int inf=
0xfffffff
;const
int maxn=
5200199
;int s,t,n,m;
int tot=1;
int first[maxn]
;int dep[maxn]
;struct node
;node edge[maxn*2]
;void
add(
int u,
int v,
int w)
bool
bfs(
)//建立分層圖,每次dfs就是在最新的分層圖的基礎上進行的 }}
return dep[t]!=-
1;}int
dfs(
int u,
int flow)
//以u記錄當前編號,flow記錄目前的最大流
int delta=flow;
// !!重點,以delta記錄 向下傳遞的最大流 與 實際接收的最大流 的差。 -->其實就是inf與最後答案的差
for(
int i=first[u]
;i;i=edge[i]
.next)
edge[i]
.v-=sum;
edge[i^1]
.v+=sum;
//正向和反向邊處理
delta-
=sum;
//看圖 if(
!delta)}}
return flow-delta;//}
intread()
if(c==
'-')
while
(c>=
'0'&& c<=
'9')
return f*k;
}int main (
)long
long ans=0;
while
(bfs()
) ans+
=dfs
(s,inf)
;printf
("%lld\n"
,ans)
;return0;
}
其實delta就是陰影部分,最後答案就是最上面一層(flow)減去陰影(delta)
還有乙個小問題,據說當前弧優化有時會出問題?(我們老師說的) 哪位大佬能幫忙解解惑呀
網路流最大流 Dinic演算法
o n 2 m 的演算法 比ek的o n m 2 優很多 ek通常解決10 3 10 4規模的網路 而dinic能解決10 4 10 5的網路 dinic演算法的思想也是分階段地在層次網路中增廣。它與最短增廣路演算法不同之處是 最短增廣路每個階段執行完一次bfs增廣後,要重新啟動bfs從源點vs開始...
網路流 最大流Dinic演算法
突然發現到了新的一年什麼東西好像就都不會了涼涼 建殘量網路圖 在殘量網路圖上跑增廣路 重複1直到沒有增廣路 注意乙個殘量網路圖要盡量把價值都用完,不然會浪費建圖的時間 include include include include include include include include in...
網路流 最大流之Dinic演算法
網路流主要解決三種問題 最大流 最小流和費用流。最大流演算法主要有三種 ek演算法 dinic演算法 sap演算法。本篇部落格是關於dinic演算法的。最壞的情況下,dinic演算法將達到複雜度o v e2 o v2e 1 include 2 include 3 include 4 include ...