我一直在寻找解决方案,但卡住了。
我需要在无向图中找到最短路径。作为输入,我得到了一组无向边(x,y,p)
,其中x
和y
是节点,p
是x
和{{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
,应该是算法的输出。
答案 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。
一开始,您只知道与起始节点相邻的节点的成本最低,因此请填入。
现在,向前传播,您可以找到与这些节点相邻的节点的最低成本,依此类推,直到您填写整个图表为止。