![](/img/trans.png)
[英]Calculate the shortest path between a set of vertices in an undirected weighted graph
[英]How to calculate the shortest path for a graph with weighted vertices?
我想弄清楚,如何计算具有加权顶点的图形的最短路径。 Dijkstra 和 Floyd-Warshall 等经典算法通常使用加权边,我没有看到如何将它们应用于我的案例(加权顶点):
我的想法之一是将图形转换为带有加权边的更经典的视图。 这是我收到的:
这里我们有单向和双向加权边,但我仍然不确定哪种算法会处理这个以找到最短路径。
您当然可以通过转换图形来做到这一点。 最简单的方法是将每条边转换为一个顶点,然后将新顶点与与用于连接它们的顶点具有相同成本的边连接在一起。
但你真的不需要为这些而烦恼......
Dijkstra 的算法很容易适应顶点成本,而无需使用任何此类转换。 当你穿越边缘,而不是new_vertex_cost = old_vertex_cost + edge_weight,你只是做new_vertex_cost = old_vertex_cost + new_vertex_weight。
您可以将问题简化为经典的最短路径问题,并根据需要使用 Dijkstra、Bellman-Ford 或 Floyd-Warshal。 为简单起见,在下文中,我假设所有权重都是非负的。 我认为这样的假设是合理的,因为问题提到使用 Dijkstra 算法来解决问题。 最后,可以小心地删除这个假设。
考虑问题的最一般形式:假设G = <V, E>
是一个有向加权图,在边和顶点上都有权重。 构造一个图H = <V', E'>
,权重仅在边上,如下所示: 对于G
任何节点v
,在 H 中创建两个节点v_in
和v_out
; 添加一条边(v_in -> v_out)
,其权重等于G
中节点v
的权重。 此外,对于G
任何边(u -> w)
在G
中添加一条边(u_out -> w_in)
(新边与原始边具有相同的权重)。
总而言之,对于原始图中的任何顶点,在
H
添加两个顶点,一个专用于传入边,另一个专用于传出边(此外,根据G
相应顶点的权重连接H
的新相关节点)。
现在,您有一个有向加权图H
,顶点没有权重,只有边权重。 很容易证明H
(s_in, t_out)
之间的最短路径与原始图G
(s,t)
之间的最短路径相同。
证明基于这样一个事实,即当且仅当
G
的相应路径通过节点v
,任何此类路径都经过H
的边(v_in, v_out)
。
就分析而言,我们有|V'| = 2|V|
|V'| = 2|V|
, 和|E'| = |E| + |V|
|E'| = |E| + |V|
. 因此,减少不会影响用于寻找最短路径的算法的渐近行为。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.