【问题标题】:How to do shortest path algorithm for unweighted graph?如何为未加权图做最短路径算法?
【发布时间】:2015-05-02 08:44:42
【问题描述】:

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

在这个问题中,从一个顶点到它的相邻顶点的距离将等于 1。即,如果考虑具有边 (a,b),(a,c) 的图,则从 a 到 b 的距离c 为 1,b 到 c 的距离为 2。 此外,还维护了一个邻接表来存储每个顶点的所有相邻顶点。

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

【问题讨论】:

标签: python algorithm graph shortest-path


【解决方案1】:

您可以使用 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']

【讨论】:

  • 我试过了,但是我正在使用的 pyscipter 中没有包 networkx。安装的python版本是2.7,pyscripter版本是2.53..是否支持networkx?
  • pyscripter 只是一个 IDE。对模块使用pip install networkx。
【解决方案2】:

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

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

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

不管怎样,你可以使用 BFS http://en.wikipedia.org/wiki/Breadth-first_search

【讨论】:

  • 能否请您在此处添加解决方案的某些部分,而不仅仅是链接?
  • 你的想法很棒。是的,我们可以将边缘权重设置为 1,然后使用 Dijkstra。
【解决方案3】:

你可以通过一个函数找到所有路径,然后选择长度最小的路径。

但请注意,这个问题更多地取决于您的搜索算法,例如使用 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])) 

并以len 为键,找到具有min 函数的最小路径:

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2019-05-05
      • 2014-06-26
      相关资源
      最近更新 更多