我有这样一个MultiDigraph
:
G=nx.MultiDiGraph()
G.add_edge(1,2,attr=0.5)
G.add_edge(3,2,attr=1.0)
我试图找到节点3将提供的结果是这样的,从节点1的路径:
1 to 2 (forward), 2 to 3 (reverse).
任何Networkx办法做到这一点?谢谢,
您可以创建图形的无向版本,检查那里的路径。然后回到你向图找到,如果你不得不向后沿着特定边走:
Gu = G.to_undirected()
path = nx.shortest_path(Gu, source=1, target=3)
# Go through each edge in the path to check if it's "forward"
for x in range(len(path)-1):
if G.has_edge(path[x], path[x+1]):
print(f'{path[x]} to {path[x+1]} (forward)')
elif G.has_edge(path[x+1], path[x]):
print(f'{path[x]} to {path[x+1]} (reverse)')
else:
# This shouldn't happen but always good to check
print(f'No path from {path[x]} to {path[x+1]}')
你可以找到无向G的路径,然后让所有的边缘,这建立无向G的路径,并检查这些边缘由路径诱导原始图的节点子VS [(1, 2), (2, 3)]
[(1, 2), (3, 2)]
:
import networkx as nx
G=nx.MultiDiGraph()
G.add_edge(1,2,attr=0.5)
G.add_edge(3,2,attr=1.0)
path = nx.shortest_path(G.to_undirected(), source=1, target=3)
path_edges = zip(path, path[1:])
path_subgraph = G.subgraph(path)
for i in path_edges:
if i in path_subgraph.edges():
print(f'{i[0]} to {i[1]} (forward)')
else:
print(f'{i[0]} to {i[1]} (reverse)')
# 1 to 2 (forward)
# 2 to 3 (reverse)