我正在尝试生成完整的路径列表,而不是优化的路径列表。使用下面的示例可以更好地解释。
import networkx as nx
G = nx.Graph()
G.add_edges_from([(0, 1), (1, 2), (2, 3)])
G.add_edges_from([(0, 1), (1, 2), (2, 4)])
G.add_edges_from([(0, 5), (5, 6)])
上面的代码创建一个具有边0=>1=>2=>3
和0=>1=>2=>4
和0=>5=>6
的图
我只想从0
中提取所有路径。
我尝试过:
>> list(nx.dfs_edges(G, 0))
[(0, 1), (1, 2), (2, 3), (2, 4), (0, 5), (5, 6)]
我想要的是:
[(0, 1, 2, 3), (0, 1, 2, 4), (0, 5, 6)]
networkx
中有没有可以使用的预先存在的方法?如果没有,有什么方法可以写出可以完成这项工作的最佳方法?
注:我的问题仅限于给定的示例。没有更多的极端情况。
Note2:为简化起见,生成了数据。在我的情况下,边缘列表来自数据集。假设有一个图和一个节点(说0
),我们可以生成所有路径吗?
尝试一下:
import networkx as nx
G = nx.Graph()
G.add_edges_from([(0, 1), (1, 2), (2, 3)])
G.add_edges_from([(0, 1), (1, 2), (2, 4)])
G.add_edges_from([(0, 5), (5, 6)])
pathes = []
path = [0]
for edge in nx.dfs_edges(G, 0):
if edge[0] == path[-1]:
# node of path
path.append(edge[1])
else:
# new path
pathes.append(path)
search_index = 2
while search_index <= len(path):
if edge[0] == path[-search_index]:
path = path[:-search_index + 1] + [edge[1]]
break
search_index += 1
else:
raise Exception("Wrong path structure?", path, edge)
# append last path
pathes.append(path)
print(pathes)
# [[0, 1, 2, 3], [0, 1, 2, 4], [0, 5, 6]]