我有一個從S到T的有向圖。如何使用Python NetworkX找到最長的路徑?
我想找到路徑(S,A,C,E,T)及其容量之和(1 + 2 + 3 + 1 = 7)所以總數是最大的。
我試過networkx.algorithms.flow.ford_fulkerson,但我不知道如何支持從S獲得單向方向T.
我的環境:
- 的Ubuntu 12.04
- 的Python 2.7.8
- NetworkX 1.9
- Matplotlib 1.4.0
example.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import matplotlib.pylab as p
import networkx as nx
if __name__ == '__main__':
DG = nx.DiGraph()
DG.add_edge('S', 'a', capacity=1)
DG.add_edge('a', 'b', capacity=1)
DG.add_edge('a', 'c', capacity=2)
DG.add_edge('b', 'd', capacity=1)
DG.add_edge('b', 'e', capacity=2)
DG.add_edge('c', 'e', capacity=3)
DG.add_edge('c', 'f', capacity=2)
DG.add_edge('d', 'T', capacity=1)
DG.add_edge('e', 'T', capacity=1)
DG.add_edge('f', 'T', capacity=1)
result = nx.algorithms.flow.ford_fulkerson(DG, 'S', 'T')
print(result.size(weight='capacity')) # 15.0, but I want 7.
pos = nx.spectral_layout(DG)
nx.draw(DG, pos)
nx.draw_networkx_labels(DG, pos)
nx.draw_networkx_edge_labels(DG, pos)
p.show()
# This shows a partly bidirectional graph, which is not what I want.
pos = nx.spectral_layout(result)
nx.draw(result, pos)
nx.draw_networkx_labels(result, pos)
nx.draw_networkx_edge_labels(result, pos)
p.show()
最大流量不象是那樣工作。該流程不採用單一路線,而且容量不會像這樣添加。你確定你知道你想解決什麼問題嗎? – user2357112 2014-08-31 08:02:22
我是圖論和NetworkX的新手。我只想找到從容量最大的S到T的路,我認爲NetworkX可能會有所幫助。 – ogura 2014-08-31 08:41:24
這是[最長路徑問題](http://en.wikipedia.org/wiki/Longest_path_problem),不是最大流量。 – user2357112 2014-08-31 08:58:32