使得整個網路的流量最大的流函式叫做最大流。舉個栗子,如圖 (太醜了太醜了)
邊權表示容量。
我們可以觀察到:
如果拆開了來看,
4-5-3-7這條增廣路最大流量是3,超過了相當於水管就爆了。
2-5-3-7這條增廣路最大流量是2,
2-10這條增廣路最大流量是2,
如果合併起來看的話,
發現4-5-3-7如果走了的話,那麼最大流量是3,那麼其他邊的剩餘流量就會減少,變成1-2-0-4,這樣的話,我們發現2-5-3-7這條路就不能走了。而2-10是可以走的,變成了0-8
這樣最大流就是3+2=5了。
但是如果我第一找找的是2-5-3-7呢,那麼剩餘的容量就是0-3-1-5了,那麼4-5-3-7只能流1,2-10不能走了,流量為3。明顯更少。
那麼這樣要怎麼辦呢?回溯嗎?不,我們更優美的方法解決。
我們對於每一條邊建上反邊,初始邊權為0。
沿增廣路同向邊增流w[i]-=flow,反向邊減流w[i^1]+=flow。
注意這裡使用了』 ^ '異或符,我們需要在建鄰接表時將下標從奇數開始tot=1或-1。
首先介紹ek的思路,每次bfs找增廣路,直至找不到了為止,時間複雜度o(nm2)。
**實現:
#include
using
namespace
std;
#define int long long
const
int n=
405,m=
1e4+5;
int n,m,s,t;
bool vis[n]
;int first[n]
,nex[m]
,to[m]
,w[m]
,tot=1;
struct
node
pre[n]
;void
add(
int x,
int y,
int z)
bool
bfs()
}}return0;
}int
ek() ans+=min;
//累計答案
}return ans;
}main()
cout<
);return0;
}
這裡主要介紹dinic演算法:
dinic思路是:首先bfs分層,分好層後不斷dfs找增廣路,並累計答案。時間複雜度o(n2m)。
#
include
using
namespace std;
#define
intlong
long
const
int n=
1e5+
5,m=
5e6+
5,inf=
1<<29;
int first[n]
,nex[m]
,to[m]
,w[m]
,tot=1;
int n,m,s,t,ans,dep[n]
;queue<
int>a;
void
add(
int x,
int y,
int z)
bool
bfs()}
}return0;
}int
dfs(
int x,
int flow)
//flow代表該增廣路的最大流量
}return flow-rest;
}signed
main()
int flow=0;
while
(bfs()
)//分層
while
(flow=
dfs(s,inf)
) ans+=flow;
//不斷dfs
//這裡的順序是先給flow賦值,再判斷是否是0或其他數
cout<
return0;
}
我們僅需要乙個now[m]陣列來記下邊,下次列舉直接從這個邊開始,但就這一點可以節省大量的時間。
**實現:和上面的大體相似,只需要增加幾行。
#include
using
namespace
std;
#define int long long
const
int n=
1e5+
5,m=
5e6+
5,inf=
1<<29;
int first[n]
,nex[m]
,to[m]
,w[m]
,tot=1;
int now[m]
,n,m,s,t,ans,dep[n]
;queue<
int>a;
void
add(
int x,
int y,
int z)
bool
bfs()
}}return0;
}int
dfs(int
x,int
flow)
} now[x]
=i;//記下結束的邊,下次直接搜
return flow-rest;
}signed
main()
int flow=0;
while
(bfs()
)while
(flow=
dfs(s,inf)
) ans+=flow;
cout<
return0;
}
計算最大流的基本dinic演算法就介紹完了。qw 網路流 最大流學習
ek演算法模板很好 最大流講解很好 一 什麼是網路流?什麼是最大流 最大流就是解決從源點到匯點的最大流量問題。二 網路流中的定義 術語 有相同g 中 滿足上述條件的圖g稱為網路流圖。記為g v,e,c 流量 流量是一條弧的實際流過的水量 通常用f u,v 表示 流量 一定不大於該弧的容量 f u,v...
網路流 最大流
網路流 題記 網路流是最近講過的最迷演算法 網路流 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 的流量。而對於一組具有源點和匯點,且總流出量 總流入量,則稱為網路中的一條可行流。拿例子來說 ...