图 - 具有顶点权重的最短路径

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) 在此解决方案中,您“错过”了源的权重,因此从 st 的最短路径将是:dijkstra(s,t,w') + vertex_weight(s)_ [其中 dijkstra(s,t,w') 是从 st 用掉 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 将与什么相邻?

以上是关于图 - 具有顶点权重的最短路径的主要内容,如果未能解决你的问题,请参考以下文章

数据结构8——最短路径

Dijkstra 的最短路径算法不返回权重最小的最短路径

图算法|Dijkstra最短路径算法

用Dijkstra算法求图中从顶点a到其他各顶点间的最短路径,并写出执行算法过程中各步的状态。

访问k个顶点的无向图中的最短路径

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++