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...