有一個在http://en.wikipedia.org/wiki/Longest_path_problem
這裏提到的一個線性時間算法是一個(非常輕度測試)實施
EDIT,這顯然是錯誤的,見下文。 +1用於將來的檢測比輕度更多發佈
import networkx as nx
def longest_path(G):
dist = {} # stores [node, distance] pair
for node in nx.topological_sort(G):
pairs = [[dist[v][0]+1,v] for v in G.pred[node]] # incoming pairs
if pairs:
dist[node] = max(pairs)
else:
dist[node] = (0, node)
node, max_dist = max(dist.items())
path = [node]
while node in dist:
node, length = dist[node]
path.append(node)
return list(reversed(path))
if __name__=='__main__':
G = nx.DiGraph()
G.add_path([1,2,3,4])
print longest_path(G)
編輯前:修改後的版本(使用您自己的風險,並請報告bug)
def longest_path(G):
dist = {} # stores [node, distance] pair
for node in nx.topological_sort(G):
# pairs of dist,node for all incoming edges
pairs = [(dist[v][0]+1,v) for v in G.pred[node]]
if pairs:
dist[node] = max(pairs)
else:
dist[node] = (0, node)
node,(length,_) = max(dist.items(), key=lambda x:x[1])
path = []
while length > 0:
path.append(node)
length,node = dist[node]
return list(reversed(path))
if __name__=='__main__':
G = nx.DiGraph()
G.add_path([1,2,3,4])
G.add_path([1,20,30,31,32,4])
# G.add_path([20,2,200,31])
print longest_path(G)
這不是家庭作業。當然,networkx會實現這個算法?我試過你的鏈接,它似乎需要登錄? – barrycarter
我更新了代碼。你是對的 - 那個環節不好。應該有其他參考 - 也許我們可以找到一個好的。 – Aric
事實證明,我的圖已經進行了拓撲排序,並且我可以根本不使用networkx來解決問題(通過跟蹤每個節點的最長傳入路徑和每個此類路徑的前一個節點,就像您指出的那樣)。簡直不敢相信! – barrycarter