網路流 最大流學習

2021-09-24 02:45:13 字數 2882 閱讀 8812

ek演算法模板很好:

最大流講解很好:

一、什麼是網路流? 什麼是最大流

最大流就是解決從源點匯點最大流量問題。

二、網路流中的定義、術語

有相同g = 中

滿足上述條件的圖g稱為網路流圖。

記為g = (v,e,c)

流量: 流量是一條弧的實際流過的水量(通常用f(u,v)表示), 流量 一定不大於該弧的容量(f(u,v)<= c(u,v)), 也可以說容量就是該弧流量的上限。

可行流: 只要滿足f(u,c)<= c(u,v), 我們就稱流量f(u,v)是可行流。

正向弧:從s到t的一條簡單路徑(又叫跡), 如果邊(u,v)與該路徑方向相同叫做,正向弧。

反向弧:從s到t的一條簡單路徑(又叫跡), 如果邊(u,v)與該路徑方向相反叫做,反向弧。

殘餘網路:計算出圖中的每條邊上容量與流量之差(稱為殘餘容量),即可得到殘餘網路。注意由於反向邊的存在,殘餘網路中的邊數可能到達原圖中邊數的兩倍。

為什麼要增加反向邊?

因為用bfs尋找增廣路時, 會破壞其他路徑,也就是這種演算法的弊端, 所以增加了

反向邊, 可以有反悔的餘地。如果反悔,就利用當前的流到a的流量,來退掉一些以往流到a的流量,是這些被退掉的流量能夠通過別的路徑到達匯點。反向邊的作用->

最大流就是解決網路流圖上 從源點匯點最大流量問題。先看(主要是1. 2. 講的好)1和2.

1.最大流講解很好:

2.ek演算法模板很好:

dinic 演算法:

3.最大流演算法之ford-fulkerson演算法與edmonds–karp演算法:

4.圖論的幾個演算法講解(含ek ,ford-fulkerson,  dinic演算法, 含時間複雜度)

ek演算法就是:

(1)通過bfs找增廣路;如果找到執行②; 否則結束

(2)計算出增加量, 構造出殘留網路(就是 對應邊減去增加量,對應邊的反向邊加上增加量);

(3)重複(1)(2)

#include

#include

#include

using

namespace std;

const

int maxn =

205;

const

int inf =

0x3f3f3f3f

;int r[maxn]

[maxn]

;/**** 殘留網路, 初始化為原圖 ,鄰接矩陣儲存***/

bool visit[maxn]

;/***標記訪問過點, 標記陣列**/

int pre[maxn]

;/*****存該節點的前乙個被訪問的節點****/

int m, n;

/**m邊 n是點**/

bool

bfs(

int s,

int t)

/******尋找一條從s 到 t的增廣路, 若存在 返回 true***********/}}

return

false;}

long

long

edmondskarp

(int s,

int t)

/******ek 演算法, s源點 t匯點******/

maxflow+

=d;/***加上最大量**/

}return maxflow;

}int

main()

long

long maxflow =

edmondskarp(1

,n);

printf

("%lld\n"

, maxflow);}

return0;

}

dinic演算法【鄰接矩陣版】:

①bfs 構造 層次網路; 如果 不能構造 層次網路結束。

②dfs在層次網路的基礎上,找增廣路, 求增加量。

③ 如果增加量 為 0 , 重複 ①操作; 否則 繼續進行 ②操作

#include

#include

#define ll long long

#include

using

namespace std;

const ll inf =

0x3f3f3f3f3f3f

;const ll maxn =

1210

;ll n, m;

ll s, t;

ll level[maxn]

;struct node

edge[maxn]

[maxn]

;bool

bfs(

)/****bfs 用來構造 層次網路 存在 level中******/}}

return level[t]!=0

;/****t 的層 不是 0 表示能構造層次網路*****/

}ll dfs

(ll x, ll cp)

ll flow = cp;

for(ll y =

1;y<= n;y++)}

if(flow ==0)

}return cp-flow;

/***cp - flow 就是 增加量**/

}ll dinic()

}return maxflow;

}int main (

)printf

("%lld\n"

,dinic()

);}return0;

}

網路流 最大流

網路流 題記 網路流是最近講過的最迷演算法 網路流 network flows 是一種模擬水流的解決問題方法,與線性規劃密切相關。非常重視選手在網路流上的建模技巧,畫圖是非常關鍵的。1 最大流 問題引入 有n條溝渠,與水坑s t相連,匯聚成m個點,第i條溝渠的水流的流量為c i 每乙個點的流入量和流...

網路流(最大流)

我們圍繞一道題來講解吧 藍橋杯 演算法訓練 網路流裸題 首先,何為網路流最大流問題?可行流 對於每條路線 u,v 上給定乙個實數f u,v 滿足 0 f u,v c u,v 則稱f u,v 為路線 u,v 的流量。而對於一組具有源點和匯點,且總流出量 總流入量,則稱為網路中的一條可行流。拿例子來說 ...

網路流 最大流

dinic 最大流 head x 從0開始記 這樣便於找反向邊 異或即可 當前弧優化 include include include include include include include define ll long long define ull unsigned long long d...