# -*- encoding:gbk -*-例子為數學建模8.4例2from 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)
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 ...