資源限制
時間限制: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,這些邊稱為反向邊。定義其中的兩個點位源點和匯點,則這個...