修改的最短路径算法

时间:2014-03-08 15:51:51

标签: algorithm graph depth-first-search shortest-path

我一直在寻找解决方案,但卡住了。

我需要在无向图中找到最短路径。作为输入,我得到了一组无向边(x,y,p),其中xy是节点,px和{{1}之间边缘的权重}。

路径的长度定义为每个节点的相邻边缘之间的绝对差值之和。

边缘示例:

y

1 2 1 1 3 5 2 4 5 3 4 5 4 6 2 1有多条路径:

6

因此,最短路径的长度为1 -> 2 -> 4 -> 6 weight = |5 - 1| + |2 - 5| = 7 1 -> 3 -> 4 -> 6 weight = |5 - 5| + |2 - 5| = 3 ,应该是算法的输出。

2 个答案:

答案 0 :(得分:3)

你可以在边缘而不是节点上使用Dijkstra,它会起作用。设s为源节点,t为目标。 w(i,j)是边(i,j)的权重。

d(i,j) = infinity for all edges (i,j)
q = new empty priority queue, ordered by d
for all edges (s,x):
    d(s,x) = 0
    insert (s,x) into q
while q is not empty:
    (x,y) = q.dequeue
    for all edges (y,z):
        if z != x and d(x,y) + |w(x,y) - w(y,z)| < d(y,z):
            d(y,z) = d(x,y) + |w(x,y) - w(y,z)|
            insert (y,z) into q

结果将是边(x,t)的最小距离。如果优先级队列实现为二进制堆,则运行时为O(m * log m)

答案 1 :(得分:-1)

要解决此类问题,您可以使用最小/最大流类型方法。

对于每个节点,您有两个可能的条件:您要么知道到达该节点的最快方式,要么您知道。因此,您可以使用数字标记每个节点,如果不知道该节点的最低成本是什么,则使用null。

一开始,您只知道与起始节点相邻的节点的成本最低,因此请填入。

现在,向前传播,您可以找到与这些节点相邻的节点的最低成本,依此类推,直到您填写整个图表为止。