问题:通过首选顶点的最小路径

时间:2018-10-26 16:17:24

标签: algorithm graph-algorithm

我需要帮助来解决这个问题:

您有一个图形G =(V,E),节点对s≠t∈V,并且您有节点U⊆V的子集,且存在ø≠U≠V且s,t exists U. 对于每个路径P,我们将其标记为L(P)路径的长度(路径中的边数)和#P(U)路径中节点U的数量,编写一种算法来查找从s到S之间的路径。应该两次精确地访问U ,以及所有这些曲目的最小长度。 换句话说,该算法应返回从s到t的路径,其中#P(U)= 2,并且可以说我们还有一条从s到t的路径P',其中#P'(U)= 2然后L(P)≤L (P') (允许轨道多次通过某个顶点)。 帮助:使用图归约G'

1 个答案:

答案 0 :(得分:0)

将轨迹分为5个步骤 {s} ∪X → U → X∪ {ε} → U → X∪ {t} where X = V \\ (U∪ {s, t}) (X组V以外的顶点(不是s或t)都不是首选顶点,这将确保#P(U)= 2,我们将使用BFS查找最短路径。

算法- 根据G(V,E)构造新的方向图G ^'=(V ^',E ^'),如下所示: 每个首选顶点u∈U,我们对V ^'so加两次,因此u_4∈V^',u_2∈V^'。我们将s和t添加到新图中,并为每个x∈X顶点在新图中创建x_1,x_3,x_5。

For each arc (s, x) ∈E | x∈X, {(s, x_1)} ∈E ^ '
Per arc (s, u) ∈E | u∈U, {(s, u_2)} ∈E ^ '
For each arc (x, u) ∈E | x∈X, u∈U, {(x_1, u_2), (x_3, u_4)} ∈E ^ '
Per arc (u, x) ∈E | u∈U, x∈X, {(u_2, x_3), (u_4, x_5)} ∈E ^ '
Per arc (u, u ') ∈E | u, u'∈U, {(u_2, u_4 ^ ')} ∈E ^'
Per arc (u, t) ∈E | u∈U, {(u_4, t)} ∈E ^ '
For each arc (x, t) ∈E | x∈X, {(x_5, t)} ∈E ^ '

我们现在将从s开始对图G'进行BFS扫描。对于扫描中t的首次出现,从s到t的轨迹(在降低标记以使其在G中具有轨迹之后)是满足问题条件的最短轨迹。如果在扫描中没有找到t,则没有这样的轨迹。 算法的正确性- #P(U)= 2-通过定义图G',我们保证从s到t的每个轨迹将在U的顶点上精确通过两次(这可以通过将顶点标记为1-5阶段和始终保持圆弧来看出分阶段前进,而没有可能跳过U顶点的第2和第4阶段。 最短的路径-使用BFS扫描可确保接受最短的路径,因为扫描是在出现在较早级别的顶点时执行的级别-不会在较晚级别出现。

最后,将标签放低以确保路线在G中。 算法的复杂度- 通过一次遍历G的所有顶点和圆弧来构造图G',因此以Θ(m + n)运行,在以Θ(m + n)运行的G'上扫描BFS(通过BFS运行时),我们得到运行时间总计为Θ(m + n)。