如何计算具有加权顶点的图的最短路径?
How to calculate the shortest path for a graph with weighted vertices?
我想弄明白,如何计算具有加权顶点的图的最短路径。 Dijkstra 和 Floyd–Warshall 等经典算法通常使用加权边,但我没有看到如何将它们应用于我的案例(加权顶点)的方法:
我的一个想法是将图形转换为具有加权边的更经典的视图。这是我收到的:
这里我们有单向和双向加权边,但我仍然不确定哪种算法可以处理这个问题以找到最短路径。
您可以将问题简化为经典的最短路径问题,并根据需要使用 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)
,在 H 中添加一条边 (u_out -> w_in)
(新边与原始边具有相同的权重)。
To summarize, for any vertex in the original graph add two vertices in
H
, one dedicated to ingoing edges, and the other dedicated to the
outgoing edges (also, connect the new correlated nodes in H
based on
the weight of their corresponding vertex in G
).
现在,您有一个有向加权图 H
,顶点没有权重,只有边有权重。很容易证明H
中(s_in, t_out)
之间的最短路径与原图G
中(s,t)
之间的最短路径相同。
The proof is based on the fact that any such path goes through the
edge (v_in, v_out)
in H
if and only if the corresponding path in
G
goes through node v
.
就分析而言,我们有 |V'| = 2|V|
和 |E'| = |E| + |V|
。因此,减少不会影响所用算法寻找最短路径的渐近行为。
你当然可以通过转换图形来做到这一点。最简单的方法是将每条边转换为一个顶点,并将新顶点与与用于连接它们的顶点具有相同成本的边连接在一起。
但你真的不需要为这些烦恼......
Dijkstra 的算法很容易适应顶点成本,而无需使用任何此类转换。当你遍历一条边时,而不是 new_vertex_cost = old_vertex_cost + edge_weight,你只需要 new_vertex_cost = old_vertex_cost + new_vertex_weight.
我想弄明白,如何计算具有加权顶点的图的最短路径。 Dijkstra 和 Floyd–Warshall 等经典算法通常使用加权边,但我没有看到如何将它们应用于我的案例(加权顶点)的方法:
我的一个想法是将图形转换为具有加权边的更经典的视图。这是我收到的:
这里我们有单向和双向加权边,但我仍然不确定哪种算法可以处理这个问题以找到最短路径。
您可以将问题简化为经典的最短路径问题,并根据需要使用 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)
,在 H 中添加一条边 (u_out -> w_in)
(新边与原始边具有相同的权重)。
To summarize, for any vertex in the original graph add two vertices in
H
, one dedicated to ingoing edges, and the other dedicated to the outgoing edges (also, connect the new correlated nodes inH
based on the weight of their corresponding vertex inG
).
现在,您有一个有向加权图 H
,顶点没有权重,只有边有权重。很容易证明H
中(s_in, t_out)
之间的最短路径与原图G
中(s,t)
之间的最短路径相同。
The proof is based on the fact that any such path goes through the edge
(v_in, v_out)
inH
if and only if the corresponding path inG
goes through nodev
.
就分析而言,我们有 |V'| = 2|V|
和 |E'| = |E| + |V|
。因此,减少不会影响所用算法寻找最短路径的渐近行为。
你当然可以通过转换图形来做到这一点。最简单的方法是将每条边转换为一个顶点,并将新顶点与与用于连接它们的顶点具有相同成本的边连接在一起。
但你真的不需要为这些烦恼......
Dijkstra 的算法很容易适应顶点成本,而无需使用任何此类转换。当你遍历一条边时,而不是 new_vertex_cost = old_vertex_cost + edge_weight,你只需要 new_vertex_cost = old_vertex_cost + new_vertex_weight.