我有一个非负重量的图表,在这个图表中有任何"特殊"弧。 找到一个算法,可以找到两个顶点之间的最小路径,最多使用k" special"弧。 输入:graph,s,t,k。
如果存在超过k弧特殊废料的路径,我想到了使用以t为基础的树的树。 此时我应该有一个DAG并使用任何算法来找到最小距离。
答案 0 :(得分:1)
我有两种方法:
第一种方法:
对于每个顶点u
,计算从源k+1
到该顶点的最短路径s
。因此,每个顶点都有一个数组dst = {d0, d2, d3, .... , dk}
,其中di
是从s
到u
使用精确i
特殊弧的最短路径。
现在,您可以使用dikstra's algorithm的变体来解决此问题,而不是拥有一个优先级队列,而是拥有k + 1
个优先级队列,其中每个队列对应的值为i : 0 <= i <= k
。
第二种方法(更优雅):
想象你有一个k + 1
楼层的建筑物。每层楼都有一张图表;然而,特殊的弧形作为相邻楼层之间的楼梯。因此,如果原始图形中顶点u
顶点v
之间有一个特殊弧,则在u
层中的每个顶点j (0 <= j <= k-1)
和每个顶点{{}之间将有一个弧。 1}}在楼层v
。因此,在此新图表中,从楼层j + 1
中的顶点u
到楼层0
中的顶点v
的任何路径都使用完全j
个特殊弧。然后在新图表中,您不能使用超过j
个特殊弧线从任何顶点u
到任何其他顶点v
,因为您最多只能攀爬k个楼层。您可以使用Dikstra算法从地板k
中的源顶点开始解决新图上的问题。
运行时间为0
。