我正在使用networkx处理图。我有一个很大的图(其中有近200个节点),我尝试查找两个节点之间的所有可能路径。但是,据我了解,networkx只能找到最短的路径。如何不仅获得最短路径,还获得所有可能路径?
UPD:路径只能包含每个节点一次。
UPD2:我需要类似find_all_paths()函数的功能,在此进行描述:python.org/doc/essays/graphs.html但是,此功能不适用于大量节点且边缘==
igraph是Python的另一个图形模块,可以计算给定节点对之间的所有 最短 路径。计算所有路径没有意义,因为您有无数个这样的路径。
从顶点0计算所有最短路径的示例:
>>> from igraph import Graph
>>> g = Graph.Lattice([10, 10], circular=False)
>>> g.get_all_shortest_paths(0)
[...a list of 3669 shortest paths starting from vertex 0...]
如果您拥有igraph 0.6或更高版本(在撰写本文时为开发版本),则也可以将结果限制get_all_shortest_paths
为给定的最终顶点:
>>> g.get_all_shortest_paths(0, 15)
[[0, 1, 2, 3, 4, 14, 15],
[0, 1, 2, 12, 13, 14, 15],
[0, 10, 11, 12, 13, 14, 15],
[0, 1, 11, 12, 13, 14, 15],
[0, 1, 2, 3, 13, 14, 15],
[0, 1, 2, 3, 4, 5, 15]]
当然,您必须要小心;例如,假设您有一个100 x 100的网格图(可以通过Graph.Lattice([100, 100], circular=False)
igraph轻松生成)。从左上角节点到右下角节点的最短路径数等于从200个元素中选择100个元素的可能性的数量(证明:最短路径的长度有200条边,其中100条会“水平”走)在网格中,其中100个将“垂直”移动)。这可能不适合您的内存,因此即使在这两个节点之间计算所有
最短 路径也不是切实可行的。
如果确实需要两个节点之间的所有路径,则可以使用igraph重写提到的网页上给出的功能,这可能比纯Python解决方案要快,因为igraph的核心是用C实现的:
def find_all_paths(graph, start, end, path=[]):
path = path + [start]
if start == end:
return [path]
paths = []
for node in set(graph.neighbors(start)) - set(path):
paths.extend(find_all_paths(graph, node, end, path))
return paths
可以通过首先将图形转换为邻接表表示来进一步优化,因为它将避免重复调用graph.neighbors
:
def find_all_paths(graph, start, end):
def find_all_paths_aux(adjlist, start, end, path):
path = path + [start]
if start == end:
return [path]
paths = []
for node in adjlist[start] - set(path):
paths.extend(find_all_paths_aux(adjlist, node, end, path))
return paths
adjlist = [set(graph.neighbors(node)) for node in xrange(graph.vcount())]
return find_all_paths_aux(adjlist, start, end, [])
编辑 :修复了第一个示例也可以在igraph 0.5.3中工作,不仅在igraph 0.6中。
王国连通性 对查尔斯国王来说,这是繁荣的一年,他正在迅速扩大他的王国。一个美丽的新王国最近已经建成,在这个王国里有许多城市由多条单向道路连接。两个城市可能由多条道路直接连接,这是为了确保高度连接。 在这个新王国中,查尔斯国王将其中一个城市作为他的金融首都,另一个作为战争首都,他希望这两个首都之间有高度的连通性。一对城市的连通性,比如城市A和城市B,被定义为从城市A到城市B的不同路径的数量。如果可能
我们希望您能够帮助我们解决以下问题: 给出了一个可能包含圈的有向图。必须找到一组满足以下标准的路径: 在从节点A到节点B的过程中可以通过的所有边必须被集合内的路径覆盖(一条边可以是集合中多条路径的一部分) 解决方案不必是路径数最少的解决方案,路径也不必是最短的。然而,该解决方案应该可以像java一样使用编程语言高效地实现。我们需要解决方案来生成几个测试用例,覆盖节点a和节点B之间的所有边很重要。
我试图通过在MST中添加新顶点来更新MST。为此,我一直在关注Chin和Houck的“更新生成树”。http://www.computingscience.nl/docs/vakken/al/WerkC/UpdatingSpanningTrees.pdf 论文中的一个步骤要求我在两个给定顶点之间的路径中找到最大的边。我的想法是找到顶点之间所有可能的路径,然后从这些路径中找到最大的边。我一直在尝试在
我正在为一个CS类做一些家庭作业,并且正在努力使用一个函数来反转两个给定节点之间的双链接列表。我对自己做错了什么感到困惑,我在谷歌上搜索过,但找不到任何有帮助的东西。 我有一个双链表,我基本上使用这个函数作为辅助函数,在两个节点之间反转它,这两个节点作为函数的参数。 下面是模板的代码,有注释以便您了解我的思考过程 那么,有什么想法吗?我已经知道问题发生在哪里,是什么,但是我还不知道为什么会发生,以
本文向大家介绍二叉树任意两个节点之间路径的最大长度?相关面试题,主要包含被问及二叉树任意两个节点之间路径的最大长度?时的应答技巧和注意事项,需要的朋友参考一下 考察点:树
我有一个有向加权图