如何为具有加权顶点的图计算最短路径?

时间:2018-12-03 19:02:13

标签: java algorithm graph-theory graph-algorithm

我正在尝试找出如何为具有加权顶点的图计算最短路径。像Dijkstra和Floyd–Warshall这样的经典算法通常可以处理带权重的边缘,但是我没有找到一种将其应用于我的案例(带权重的顶点)的方法:

graph with weighted vertices

我的想法之一是将图形转换为带有加权边的更经典的视图。这是我收到的:

graph with weighted edges

这里我们有单向和双向加权边,但是我仍然不确定哪种算法可以处理这个问题,以找到最短的路径。

2 个答案:

答案 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_inv_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|。因此,这种减少不会影响所采用的寻找最短路径的算法的渐近行为。