最高標號預流推進演算法

2021-10-08 15:50:57 字數 2741 閱讀 6968

from queue import queue

from queue import priorityqueue

class

graph

:def

__init__

(self,_s,_t,_m)

:# 源,匯,頂點個數

self._edge=

self.s=_s # 源

self.t=_t # 匯

self.num=_m # 頂點個數

self.level=[-

1for i in

range

(_m+1)

]# 標籤高度

self.flow=[0

for i in

range

(_m+1)

]# 每個點的儲存流量

defadd_edge

(self,u,v,w)

:if u in self._edge:

self._edge[u]

[v]=w

else

: self._edge[u]

=def

bfs(self)

:# 使用bfs標號,t=0,向上搜尋

q = queue(

) q.put(self.t)

self.level[self.t]=0

while

not q.empty():

vertice=q.get(

)for i in self._edge[vertice]

:if self.level[i]==-

1and self._edge[i]

[vertice]!=0

: self.level[i]

= self.level[vertice]+1

q.put(i)

defrelabel

(self, v)

:# 重置標號

mi=self.num+

1for i in self._edge[v]

:if self._edge[v]

[i]!=0:

mi=min(mi,self.level[i]

) self.level[v]

=mi+

1def

push_relabel

(self)

:# 最高標號推進

self.bfs(

) self.level[self.s]

=self.num

p=priorityqueue(

)# 使用優先佇列,按照標號等級排序,優先彈出等級高的

for i in self._edge[self.s]

:if self._edge[self.s]

[i]!=0:

_min = self._edge[self.s]

[i] self.flow[i]

+= _min

self._edge[self.s]

[i]-= _min

self._edge[i]

[self.s]

+= _min

p.put(

(-self.level[i]

, i)

)while

not p.empty():

v=p.get()[

1]for i in self._edge[v]

:if self.flow[v]==0

:break

if self.level[i]

== self.level[v]-1

and self._edge[v]

[i]!=0:

_min =

min(self.flow[v]

, self._edge[v]

[i])

self.flow[i]

+=_min

self.flow[v]

-=_min

self._edge[v]

[i]-=_min

self._edge[i]

[v]+=_min

p.put(

(-self.level[i]

,i))

if self.flow[v]!=0

and v != self.t and v != self.s:

self.relabel(v)

p.put(

(-self.level[v]

,v))

return self.flow[self.t]

if __name__==

"__main__"

: n,m=

map(

int,

input()

.split())

# n: 邊數,s=1,t=m

network=graph(

1,m,m)

for i in

range

(n):

a,b,c=

map(

int,

input()

.split())

network.add_edge(a,b,c)

network.add_edge(b,a,0)

print

(network.push_relabel(

))

網路最大流演算法 最高標號預流推進HLPP

這個演算法。怎麼說.學來也就是裝裝13吧。長得比ek醜 跑的比ek慢 寫著比ek難 大家先來猜一下這個演算法的思想吧 joy 看看人家的名字 最高標號預留推進 多麼高階大氣上檔次2333333咳咳 從它的名字中我們可以看出,它的核心思想是 推進,而不是找增廣路 那麼它是怎麼實現推進的呢?很簡單,我們...

poj1459最高標號預流推進演算法解題報告

題目意思不再所說,前面已給過乙個ek演算法的解題報告,下面給出網路流中求最大流幾乎最快的演算法 最高標號預流推進演算法的源 include define max 65535 using namespace std int s,t,n,np,nc,m,level int h 103 e 103 d 1...

最大流問題預流推進演算法(最基本)

name 最大流問題預流推進演算法 author 巧若拙 date 14 06 17 09 26 description 最基本的預流推進演算法,沒有任何優化,每次遍歷所有的結點,找出活結點,尋找可行弧,並預流推進,若沒有可以push的頂點,執行relabel操作。include include u...