这是一个消费税:
在某些图形问题中,顶点可以有权重而不是 或者除了边缘的重量。设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)的回答太简单了,不是吗?
答案 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)在此解决方案中,您“错过”了来源的权重,因此从s
到t
的最短路径为:dijkstra(s,t,w') + vertex_weight(s)_
[其中dijkstra(s,t,w')
是使用s
t
到w'
的距离
答案 1 :(得分:4)
可以通过将两个顶点a1和a2中的每个顶点a切割为a1到a2的边,权重为a来删除顶点权重。
我认为你适应dijkstra的算法。