(c) 如果只考虑边权重,则可以使用 Dijkstra 算法,其核心部分如下:
if (distance[y] > distance[v]+weight) {
distance[y] = distance[v]+weight; // weight is between v and y
}
现在,考虑顶点权重,我们有:
if (distance[y] > distance[v] + weight + vertexWeight[y]) {
distance[y] = distance[v] + weight + vertexWeight[y]; // weight is between v and y
}
我是正确的吗?
我猜我的回答对于(c)来说太简单了,是吗?
(u,v)
,在新图中添加两条边:(u,v)
,使得w'(u,v)=w(v)
和(v,u)
,使得w'(v,u)=w(u)
。给定这个新图 - 运行 Dijkstra 算法,并获取原图中的最短路径。 - amits->u1->u2->...->un
,它将给你总权重为w'(s,u1) + ... + w'(un-1,un) = w(s,u1) + w(u1) + w(u1,u2) + w(u2) + ... + w(un-1,un) + w(un)
。在路径中不计算第一个节点的权重,因此可以在后处理期间轻松添加它。这不会影响正确性,因为G'中的所有路径都缺少相同的因子。 - amita-b
路径的权重(几乎)翻倍了 ;) (您可以通过将a
上的每条边的权重增加w(a)
,并对b
执行类似操作,使其完全加倍,尽管这不会影响找到的解决方案所发现的所有简单a-b
路径都会以相同的数量更改。) - j_random_hacker