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

时间:2012-05-04 16:56:48

标签: algorithm data-structures graph shortest-path dijkstra

这是一个消费税:

  

在某些图形问题中,顶点可以有权重而不是   或者除了边缘的重量。设Cv为顶点的代价   v和C(x,y)边的成本(x,y)。这个问题很关注   找到图G中顶点a和b之间最便宜的路径。   路径的成本是边和顶点的成本之和   遇到了这条路。

     

(a)假设图中的每条边的权重为零(而   非边缘的成本为∞)。对于所有顶点1≤v≤n,假设Cv = 1   (即,所有顶点具有相同的成本)。给出一个有效的算法   找到从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)的回答太简单了,不是吗?

2 个答案:

答案 0 :(得分:15)

你走在正确的轨道上,解决方案非常简单。

在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')是使用s

tw'的距离

答案 1 :(得分:4)

可以通过将两个顶点a1和a2中的每个顶点a切割为a1到a2的边​​,权重为a来删除顶点权重。

我认为你适应dijkstra的算法。