最大流演算法

2021-09-10 14:12:42 字數 2500 閱讀 9249

# -*- encoding:gbk -*-

from queue import queue

m = 6 # 點的個數

# 殘餘圖的剩餘流量

residual = [[0 for i in range(m)] for j in range(m)]

# 記錄最大流圖,初始都為0

maxflowgraph = [[0 for i in range(m)] for j in range(m)]

# 記錄增廣路徑前進過程記錄的最小流量

flow = [0 for i in range(m)]

# 記錄增廣路徑每個節點的前驅

pre = [float('inf') for i in range(m)]

# 佇列,用於bfs地尋找增廣路徑

q = queue()

# 設定初始圖的流量走向

residual[0][1]=3

residual[0][2]=2

residual[1][2]=1

residual[1][3]=3

residual[1][4]=4

residual[2][4]=2

residual[3][5]=2

residual[4][5]=3

# 運用bfs演算法,找到一條有向路徑

def bfs(source,sink):

q.empty() # 清空佇列

for i in range(m):

pre[i] = float('inf')

flow[source] = float('inf') # 這裡要是不改,那麼找到的路徑的流量永遠是0

# 不用將flow的其他清零

q.put(source)

while(not q.empty()):

index = q.get()

if(index == sink):

break

for i in range(m):

if( (i!=source) & (residual[index][i]>0) & (pre[i]==float('inf')) ):

# i =source,從source到source不用分析了

# residual[index][i]>0,邊上有流量可以走

# pre[i]==float('inf'),代表bfs還沒有延伸到這個點上

pre[i] = index

flow[i] = min(flow[index],residual[index][i])

q.put(i)

pre1 =

pre1 = pre[:]

pre1[0] = 111

if pre1[sink] != float('inf'):

road(sink,pre1)

if(pre[sink] == float('inf')):

# 匯點的前驅還是初始值,說明已無增廣路徑

return -1

else:

return flow[sink]

# 輸出路徑

def road(k,pre):

road =

while pre[k] != 0:

k = int(pre[k])

return print('路徑為:',road[::-1])

def maxflow(source,sink): # source : 原點, sink : 匯點

sumflow = 0 # 記錄最大流,一直累加

augmentflow = 0 # 當前尋找到的增廣路徑的最小通過流量

while(true):

augmentflow = bfs(source,sink)

if(augmentflow == -1):

break # 返回-1說明已沒有增廣路徑

k = sink

road =

while(k!=source): # k回溯到起點,停止

prev = pre[k] # 走的方向是從prev到k

maxflowgraph[prev][k] += augmentflow

residual[prev][k] -= augmentflow # 前進方向消耗掉了

residual[k][prev] += augmentflow # 反向邊

k = prev

sumflow += augmentflow

return sumflow

result = maxflow(0,m-1)

print('最大流:',result)

例子為數學建模8.4例2

c:\users\administrator\pycharmprojects\untitled\venv\scripts\python.exe e:/python/最大流演算法.py

路徑為: [0, 1, 3, 5]

路徑為: [0, 1, 4, 5]

路徑為: [0, 2, 4, 5]

最大流: 5

最大流演算法

基本的知識,解決什麼問題這些東西就不說啦。演算法導論和很多大神部落格都講解的很詳細。它其實就是不停的找增廣路直到找不到為止。此時通過的所有流量就是最大流量。ford fulkerson 最大流演算法 下面是我的實現。參考了最大流ford fulkerson的演算法實現 include include...

最大流SAP演算法

求最大流有一種經典的演算法,就是每次找增廣路時用bfs找,保證找到的增廣路是弧數最少的,也就是所謂的edmonds karp演算法。可以證明的是在使用最短路增廣時增廣過程不超過v e次,每次bfs的時間都是o e 所以edmonds karp的時間複雜度就是o v e 2 如果能讓每次尋找增廣路時的...

最大流演算法模板

最大流 memset head,1,sizeof head en 0 struct edgee e bool del v int head v d v q v stk v pre v en,src,dest void addedge int x,int y,int c bool bfs int s ...