如何对未加权图进行最短路径算法?

时间:2015-05-02 08:44:42

标签: python algorithm graph shortest-path

我正在尝试找到从顶点到另一个连接的未加权图形的最短路径。

在这个问题中,如果考虑带有边(a,b),(a,c)的图,从a到b的距离,从顶点到其相邻顶点的距离将等于1.ie。和c为1,b到c的距离为2。 此外,维护邻接列表以存储每个顶点的所有相邻顶点。

那么,是否有任何算法可以找到给定问题的所有最短路径?

4 个答案:

答案 0 :(得分:2)

您可以使用dijkstra的算法来查找距离。

以下是使用networkx

的一种方法
In [28]: import networkx as nx

创建一个包含节点a, b, c的grpah,其中链接为a, b和'a,c'

In [29]: g = nx.Graph()

In [30]: g.add_edge('a', 'b')

In [31]: g.add_edge('a', 'c')

然后使用nx.dijkstra_path_length()找到b and c

之间的距离
In [32]: nx.dijkstra_path_length(g, 'b', 'c')
Out[32]: 2

此外,您可以使用dijkstra_path()

找到路径轨迹
In [33]: nx.dijkstra_path(g, 'b', 'c')
Out[33]: ['b', 'a', 'c']

您还可以使用shortest_path()作为b and c

之间的路径
In [34]: nx.shortest_path(g, source='b',target='c')
Out[34]: ['b', 'a', 'c']

答案 1 :(得分:0)

您可以找到具有函数的所有路径,然后选择最小长度的路径。

但请注意,此问题更多地基于您的搜索算法,例如使用BFS算法:

您可以使用返回路径生成器的following function

def all_paths(graph, start, goal):
    queue = [(start, [start])]
    while queue:
        (v, path) = queue.pop(0)
        for next in graph[v] - set(path):
            if next == goal:
                yield path + [next]
            else:
                queue.append((next, path + [next])) 

找到min函数的最小路径,其中len为其关键字:

min_path = min(all_paths(graph, start, goal),key=len)

答案 2 :(得分:0)

您可以从那时起使用BFS:http://en.wikipedia.org/wiki/Breadth-first_search

如果时间不是问题,您还可以使用Floyd-Warshall算法运行O(n ^ 3)并且您想要简单:http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm

答案 3 :(得分:0)

Dijkstra算法解决了在图形中找到两个顶点(或节点)之间的路径以使其组成边缘的权重之和最小化的问题"。

http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm

所以,我认为你可以用Dijkstra解决这个问题,其中从顶点到相邻顶点的距离对于两个顶点之间的每条路径都是相等的。

无论如何,您可以使用BFS http://en.wikipedia.org/wiki/Breadth-first_search