图 - 具有顶点权重的最短路径
Posted
技术标签:
【中文标题】图 - 具有顶点权重的最短路径【英文标题】:graph - Shortest path with Vertex Weight 【发布时间】:2012-05-14 05:56:18 【问题描述】:这是一个消费税:
在某些图问题中,顶点可以有权重而不是 或者除了边的权重。设 Cv 为顶点成本 v 和 C(x,y) 是边 (x, y) 的成本。这个问题很关心 在图 G 中找到顶点 a 和 b 之间最便宜的路径。 路径的成本是边和顶点的成本之和 路上遇到的。
(a) 假设图中每条边的权重为零(而 非边的成本为 ∞)。假设 Cv =1 对于所有顶点 1≤v≤n (即,所有顶点具有相同的成本)。给出一个有效的算法 找出从 a 到 b 的最便宜的路径及其时间复杂度。
(b) 现在假设顶点成本不是恒定的(但都是 正)并且边缘成本保持如上。给一个高效的 找到从 a 到 b 的最便宜路径及其时间的算法 复杂性。
(c) 现在假设边和顶点成本都不是常数 (但都是正面的)。给出一个有效的算法来找到 从 a 到 b 的最便宜路径及其时间复杂度。
这是我的答案:
(a) 使用正常的 BFS;
(b) 使用dijkstra算法,但是用顶点权重代替权重;
(c)
同样使用dijkstra算法
如果只考虑边权重,那么对于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) 的回答太简单了,是吗?
【问题讨论】:
【参考方案1】:你在正确的轨道上,解决方案很简单。
在 B、C 中,将问题简化为正常的 dijkstra,它假定顶点没有权重。
为此,您需要定义w':E->R
,这是一个新的边权重函数。
w'(u,v) = w(u,v) + vertex_weight(v)
在 (b) w(u,v) = 0
(或 const)中,并且该解决方案也适合 (c)!
其背后的想法是使用边会消耗边的权重,以及到达目标顶点的成本。来源的费用已经支付,所以你无视它1。
减少问题,而不是更改算法,通常更易于使用、证明和分析!
(1) 在此解决方案中,您“错过”了源的权重,因此从 s
到 t
的最短路径将是:dijkstra(s,t,w') + vertex_weight(s)_
[其中 dijkstra(s,t,w')
是从 s
到t
用掉 w'
【讨论】:
我认为在(a)中,顶点具有相同的权重,而边没有权重。我们可以使用普通的 BFS 对吗? @JacksonTale 如果我正确理解了这个问题 - 关于 (a) 你是绝对正确的,我没有在关于这部分的答案中提到任何内容,因为我没有什么可以补充你已经做过的事情! 还有Reducing a problem, instead of changing an algorithm is usually much simpler to use, prove and analyse!.
这非常鼓舞人心!
@zengr:对于原始图中的每个无向边 (u,v)
,在新图中添加两条边:(u,v)
使得 w'(u,v)=w(v)
和 (v,u)
使得 w'(v,u)=w(u)
。给定这个新图 - 运行 dijkstra 算法并在原始图中获得最短路径。
@zengr 你会找到的最短路径是s->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' 中的所有路径都缺少完全相同的因子。【参考方案2】:
可以通过对两个顶点a1和a2中的每个顶点a进行切片来去除顶点权重,边从a1到a2,权重为a。
我认为你适合dijkstra算法的改编。
【讨论】:
我认为这行不通。如果 a 与 b、c 和 d 相邻,那么 a1 和 a2 将与什么相邻?以上是关于图 - 具有顶点权重的最短路径的主要内容,如果未能解决你的问题,请参考以下文章