假设我们有向G(V,E)图的边缘上具有正权重,则该图的边缘也为黑色或绿色,给定起始顶点u,我们需要找到u的最小路径(权重)到V的所有顶点。这些路径最多必须有k个绿色边(其中k是一个正整数)。有什么想法吗?
答案 0 :(得分:1)
您可以首先创建由顶点和黑色边缘的副本组成的k + 1
图G_i
:
v in V
每v_0, v_1, ... v_k
(u, v) in E
创建(u_i, v_i)
的每个黑边0 <= i <= k
这些G_i
中的每一个都代表您已经使用i
个绿色边缘之后的状态。因此,我们可以通过添加绿色边缘来连接这些图:
(u, v) in E
都为所有(u_i, v_{i+1})
创建边缘0 <= i < k
。边缘是有方向的,因此您不能向后移动,即,已使用的绿色边缘的数量永远不会减少。
最后,添加汇点顶点:
v in V
创建一个v_s
,并为所有(v_i, v_s)
创建一个权重为0的边缘0 <= i <= k
。这些下沉顶点允许为所使用的每个绿色顶点确定到顶点v
的最小距离。
现在,只需以起始顶点u_0
运行Dijkstra即可。对于所有v in V
,v_s
的结果是使用最多u
个绿色边缘从v
到k
的最短距离。
Dijkstra的运行时间为O(|E| + |V| log |V|)
。我们的顶点总数为O(k) * |V|
,边的总数为O(k) * |E|
,因此最终运行时间为
O(k|E| + k|V| log k|V|)