|
发表于 2018-12-10 15:40:55
|
显示全部楼层
- topo = { 1 : {2 : 16, 3 : 13, 4 : 13, 5 : 5 , 6 : 2},
- 2 : {1 : 0, 3 : 10,5 : 10, 9 : 10 },
- 3 : {1 : 0, 2 : 0, 4 : 10, 5: 0 , 7 : 10},
- 4 : {1 : 0, 3 : 0 , 6 : 10 , 10 : 10},
- 5 : {1 : 0, 2 : 0 , 3 : 10 , 8 : 10},
- 6 : {1 : 0 , 4 : 0 , 7 : 10 , 10 : 10},
- 7 : {3 : 0 , 6 : 0 , 8 : 10 , 10 : 10},
- 8 : {5 : 0 , 7 : 0 , 9 : 10 , 10 : 10},
- 9 : {2 : 0 , 8 : 0 , 10 : 10},
- 10 : {4: 0 , 6 : 0 , 7 : 0 , 8 : 0 , 9 : 0} }
- def init_dis(s, t, dis):
- if s == t: return
- for node in topo[t]:
- print(node,t)
- if topo[node][t] > 0 and dis[node] == 0:
- dis[node] = dis[t] + 1
- init_dis(s, node, dis)
- def get_augment_path(s, t, dis, pre, remain):
- if s == t: return remain
- for node, cap in topo[s].items():
- if cap > 0 and dis[s] == dis[node] + 1 and pre[node] == 0:
- if remain > cap: remain = cap
- pre[node] = s
- rst = get_augment_path(node, t, dis, pre, remain)
- if rst != 999:
- topo[s][node] = topo[s][node] - rst
- topo[node][s] = topo[node][s] + rst
- print(s ,'->',node )
- print(topo[s][node])
- return rst
- else: # 回溯
- rst = get_augment_path(node, t, dis, pre, remain)
- if rst != 999:
- topo[s][node] = topo[s][node] - rst
- topo[node][s] = topo[node][s] + rst
- return rst
- else: # 没有允许弧,更新d
- min_d = 999
- for node in topo[s]:
- if dis[node] + 1 < min_d and topo[s][node] > 0: min_d = dis[node] + 1
- dis[s] = min_d
- return 999
- def sap(s, t):
- dis = [0 for i in range(len(topo) + 1)]
- init_dis(1, 10, dis)
- flow = 0
- while dis[s] < len(topo):
- pre = [0 for i in range(len(topo) + 1)]
- rst = get_augment_path(1, 10, dis, pre, 999)
- if rst != 999: flow = flow + rst
- print (flow)
- if __name__ == '__main__':
- sap(1, 10)
复制代码 |
|