藍橋杯 最大流問題

2021-10-23 10:56:06 字數 1827 閱讀 8084

資源限制

時間限制:1.0s 記憶體限制:256.0mb

問題描述

乙個有向圖,求1到n的最大流

輸入格式

第一行n m,表示點數與邊數

接下來m行每行s t c表示一條從s到t的容量為c的邊

輸出格式

乙個數最大流量

樣例輸入

6 10

1 2 4

1 3 8

2 3 4

2 4 4

2 5 1

3 4 2

3 5 2

4 6 7

5 4 6

5 6 3

樣例輸出

8資料約定:

n<=1000 m<=10000

n,m =

list

(map

(int

,input()

.split())

)dp =[[

0for j in

range

(m+1)]

for i in

range

(m+1)]

for i in

range

(m):

s, t, c =

list

(map

(int

,input()

.split())

) dp[s]

[t]+= c

defbfs

(dp,s,t,path)

:for i in

range

(len

(path)):

path[i]=0

vis =[0

for i in

range

(m+1)]

vis[s]=1

q =while

len(q)!=0

: tmp = q.pop(0)

for i in

range(1

,m+1):

if dp[tmp]

[i]>

0and vis[i]==0

: vis[i]=1

path[i]

= tmp

return vis[t]==1

defminc

(path,dp)

: min_ = dp[path[

len(path)-1

]][len

(path)-1

] i =

len(path)-2

while i !=1:

if dp[path[i]

][i]

< min_ and dp[path[i]

][i]

>0:

min_ = dp[path[i]

][i]

i = path[i]

return min_

path =[0

]*(n+1

)flow =

0while bfs(dp,

1,n,path)

: min_capacity = minc(path,dp)

flow += min_capacity

i=nwhile i!=1:

j = path[i]

dp[j]

[i]-= min_capacity

dp[i]

[j]+= min_capacity

i = path[i]

print

(flow)

結果一部分會超時,再勉。

最大流問題

暫時最大流問題我就先掌握這一種演算法吧 基本的最大流問題 ek演算法 基於bfs 每一次bfs更新一條路徑,雖然都會入佇列,但是由於以下條件保證點不會交叉,所以只有一條到終點的路徑會更新流量。if res v map u v flow u v 注意更新flow矩陣的時候是這樣的 while u st...

最大流問題

具體的最大流問題定義 術語以及特性,前人已經描述的很詳細了 我們需要注意以及幾個方面 增益路徑的生成次序如果不恰當,會對方法的效率有巨大的影響。如下 其中u代表某個大正整數。如果沿著路徑1 2 3 4對流量0進行增益,得到 b 中值為1的流量 接著沿著路徑1 3 2 4對流量0進行增益,得到 c 中...

最大流問題

對最大流問題比較感性的認識,要看證明還是要看演算法導論的相關章節。最大流問題 給定乙個有向圖,一般情況下邊的值為整數,定義不直接相連的節點間的邊值為0,如果有節點i和j直接由多條邊,則將這些邊合併為一條,值取和。則若i到j有邊,則j到i的邊為0,這些邊稱為反向邊。定義其中的兩個點位源點和匯點,則這個...