【发布时间】:2015-03-31 14:34:59
【问题描述】:
我有一个没有负权重的图表,在这个图表中有任何“特殊”的弧线。 找到一个算法,该算法可以找到两个顶点 s e t 之间的最小路径,最多使用 k 个“特殊”弧。 输入:graph, s ,t, k。
我考虑过使用以 s 为根,到达 t 的树,如果有一条路径有超过 k 弧的特殊废料。 此时我应该有一个 DAG 并使用任何算法来找到最小距离。
【问题讨论】:
标签: algorithm graph graph-algorithm
我有一个没有负权重的图表,在这个图表中有任何“特殊”的弧线。 找到一个算法,该算法可以找到两个顶点 s e t 之间的最小路径,最多使用 k 个“特殊”弧。 输入:graph, s ,t, k。
我考虑过使用以 s 为根,到达 t 的树,如果有一条路径有超过 k 弧的特殊废料。 此时我应该有一个 DAG 并使用任何算法来找到最小距离。
【问题讨论】:
标签: algorithm graph graph-algorithm
我有两种方法:
第一种方法:
对于每个顶点u,计算从源s 到该顶点的最短路径k+1。所以每个顶点都会有一个数组dst = {d0, d2, d3, .... , dk},其中di 是从s 到u 的最短路径,使用恰好i 特殊弧。
现在您可以使用dikstra's algorithm 的一种变体来解决这个问题,在该问题中,您拥有k + 1 优先级队列,而不是一个优先级队列,其中每个优先级队列对应一个i : 0 <= i <= k 的值。
第二种方法(更优雅):
想象一下,你有一栋有k + 1 楼层的建筑物。每个楼层都有一个图表副本;然而,特殊的弧线充当相邻楼层之间的楼梯。因此,如果您在原始图中的顶点u 顶点v 之间有一个特殊的弧,那么您将在地板j (0 <= j <= k-1) 中的每个顶点u 和地板j + 1 中的每个顶点v 之间有一条弧。所以在这个新图中,任何从 floor0 中的顶点 u 到 vertexvin floor j 的路径都恰好使用了 j 特殊弧。然后在新图表中,您不能使用超过k特殊弧线从任何顶点u 到任何其他顶点v,因为您最多只能爬k 层楼。您可以使用 Dikstra 的算法来解决新图上的问题,从 floor0 中的源顶点开始。
运行时间为O(k * |E| + k * |V| * log(k*|V|))。
【讨论】: