验证是否可以从Python NetworkX中的至少一个源节点访问所有目标节点

时间:2018-10-07 10:32:04

标签: python routing networkx dijkstra

我想知道最有效的方法是验证来自T的所有目标节点是否可以从Python的NetworkX库中的至少一个源节点S到达。

对我来说,这应该是一个简单的多对多Dijkstra函数调用,其中S是源节点列表输入,T是目标节点列表输入。然后,我可以验证返回的值是否指示至少一个路由成功。对于那些可能熟悉它的人,这就是我使用PostgreSQL的pgRouting扩展来解决该问题的方式:

pgr_dijkstra(edges_sql, start_vids, end_vids)

但是,it seems from the documentation that a function where both the sources and targets are lists does not exist。我能找到的最接近的是multi_source_dijkstraall_pairs_dijkstra

我觉得multi_source_dijkstra不够,因为我无法指定多个目标节点的列表作为输入,而all_pairs_dijkstra太多,因为我不想浪费时间测试源节点之间的连接性或目标节点之间。此外,我完全希望自己的图在内部具有空隙,我只想测试原始条件-所有目标节点都可以从至少一个源节点到达。

我敢肯定multi_source_dijkstra函数可以将某些东西拼凑在一起,但是我希望这样做尽可能高效,所以我希望我只是缺少一个可以实现我最想做的明显实现

编辑:@abc的图像。红色/黄色,红色/粉红色线和绿色线代表我在DFS或BFS算法中使用的子图。此配置返回True,声称从绿点(源)可以到达所有红点(目标)。

enter image description here

1 个答案:

答案 0 :(得分:1)

为什么要使用最短路径算法,例如 Dijkstra 的算法?
如果您的目标是检查是否至少可以从一个源节点访问所有目标节点,则只需要一种图遍历算法(例如bfsdfs)。

S = {1,2}
T = {3,4}
g = nx.fast_gnp_random_graph(6, 0.3, directed=True)

# True if all the nodes of T are reachable from at least a node in S
any(T < set(nx.bfs_tree(g,s).nodes()) for s in S)