我正在尝试找出如何为具有加权顶点的图计算最短路径。像Dijkstra和Floyd–Warshall这样的经典算法通常可以处理带权重的边缘,但是我没有找到一种将其应用于我的案例(带权重的顶点)的方法:
我的想法之一是将图形转换为带有加权边的更经典的视图。这是我收到的:
这里我们有单向和双向加权边,但是我仍然不确定哪种算法可以处理这个问题,以找到最短的路径。
答案 0 :(得分:3)
您当然可以通过变换图形来做到这一点。最简单的方法是将每个边转换为一个顶点,并将新的顶点与边成本相同的边连接起来。
但是您真的不需要去烦那些...
Dijkstra的算法非常容易适应顶点成本,而无需使用任何此类转换。遍历边缘时,只需执行 new_vertex_cost = old_vertex_cost + new_vertex_weight 即可,而不是 new_vertex_cost = old_vertex_cost + edge_weight 。
答案 1 :(得分:2)
您可以将问题简化为经典的最短路径问题,并根据需要使用Dijkstra,Bellman-Ford或Floyd-Warshal。为了简单起见,在下文中,我假设所有权重都是非负的。我认为这样的假设是合理的,因为问题提到使用Dijkstra的算法来解决问题。最后,可以小心删除此假设。
考虑问题的最一般形式:假设G = <V, E>
是有向加权图,在边和顶点上都有权重。构造图H = <V', E'>
,其权重仅在边缘上,如下所示:对于v
中的任何节点G
,在H中创建两个节点v_in
和v_out
;添加权重等于(v_in -> v_out)
中节点v
的权重的边G
。另外,对于(u -> w)
中的任何边G
,在H中添加边(u_out -> w_in)
(新边的权重与原始边的权重相同)。
总而言之,对于原始图形中的任何顶点,请在中添加两个顶点
H
,一个专用于进入边缘,另一个专用于边缘 传出边缘(也请根据以下说明连接H
中的新相关节点:G
中相应顶点的权重。
现在,您有了一个有向加权图H
,在顶点上没有权重,而在边缘上才有权重。很容易证明(s_in, t_out)
中H
之间的最短路径与原始图(s,t)
中G
之间的最短路径相同。
证据基于以下事实: 仅当且仅当
(v_in, v_out)
中的H
边G
经过节点v
。
就分析而言,我们有|V'| = 2|V|
和|E'| = |E| + |V|
。因此,这种减少不会影响所采用的寻找最短路径的算法的渐近行为。