#!/user/bin/python #PUSH-RELABEL ALGORITHM #Author Dan Liu h=[] e=[] f=[] #V=[0,1,2,3] #E=[(0,1),(1,2),(1,3),(0,2),(2,3)] #G=(V,E) #C={(0,1):3,(1,2):3,(1,3):1,(0,2):4,(2,3):5} #s=0 #t=3 V=[0,1,2,3,4,5] E=[(0,1),(1,2),(1,3),(1,4),(0,2),(2,4),(3,5),(4,5)] G=(V,E) C={(0,1):3,(1,2):1,(1,3):3,(1,4):4,(0,2):2,(2,4):2,(3,5):2,(4,5):3} s=0 t=5 Ef=[] cf={} def init_preflow(G,s): for i in G[1]: if i[0] ==s: i=(i[1],i[0]) Ef.append(i) for i in C.items(): key=i[0] if i[0][0] == s: key=(i[0][1],i[0][0]) cf[key]=i[1] for u in G[0]: h.append(0) e.append(0) for u in G[0]: l=[] for v in G[0]: l.append(0) f.append(l) for edge in G[1]: f[edge[0]][edge[1]]=0 f[edge[0]][edge[1]]=0 h[s]=len(G[0]) for edge in G[1]: if edge[0] == s: u=edge[1] tmp=C.get(edge) f[s][u]=tmp f[u][s]=-tmp e[u]=tmp e[s]-=tmp print"h=",h print"f=",f print"e=",e def push_flow(u,v): df=min(e[u],cf.get((u,v))) f[u][v]+=df f[v][u]=-f[u][v] e[u]-=df e[v]+=df cf[(u,v)]-=df if cf[(u,v)]==0: Ef.remove((u,v)) def relabel(u): Eh=[] for item in Ef: if item[0]==u: Eh.append(h[item[1]]) h[u]=1+min(Eh) def check_e(e): for i in range(len(V)): if i != s and i != t: if e[i] > 0: return i return-1 def check_push(u): for item in cf.items(): if (item[0][0]) == u and item[1] >0 and (h[u]==(h[item[0][1]]+1)): return item[0][1] return-1 def check_relabel(u): for item in Ef: if item[0]==u: if h[u]>h[item[1]]: return1 return-1 def generic_push_relabel(G): init_preflow(G,s) active_node=check_e(e) while active_node > 0: v=check_push(active_node) is_high=check_relabel(active_node) if v !=-1: print active_node, v push_flow(active_node, v) elif is_high ==-1: #else: relabel(active_node) print e active_node=check_e(e) generic_push_relabel(G) print"h=",h print"f=",f print"e=",e
#!/user/bin/python#PUSH-RELABEL ALGORITHM#Author Dan Liuh=[]e=[]f=[]#V=[0,1,2,3]#E=[(0,1),(1,2),(1,3),(0,2),(2,3)]#G=(V,E)#C={(0,1):3,(1,2):3,(1,3):1,(0,2):4,(2,3):5}#s=0#t=3V=[0,1,2,3,4,5]E=[(0,1),