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...