在加权的单路径图中查找最短路径


12

有向图被认为是unipathic如果对于任意两个顶点和在曲线图G =(V,E) ,存在在从最简单的一个路径Úvuvu vG=(V,E)uv

假设给我一个单感图G,使得每个边的权重为正或为负,但不包含负的权重周期。

由此,我想找到一种O(|V|)算法,该算法找到从源节点s到所有节点的所有最短路径s

我不确定如何解决这个问题。我正在尝试看看我如何利用它不包含负权重循环,并且当然在任何节点uv之间最多只有一条简单路径这一事实v


1
你都尝试了些什么?如果您完全陷入困境,请从小处着手:单向图的真正外观是什么?例如,用一个顶点,两个顶点,三个顶点等绘制每个单路径图。您可能会发现一个有用的模式。此外,您提到没有负重量循环-甚至可以有(任何重量)循环吗?
Juho 2012年

@mrm您在想什么模式?单向图可以有周期,但是我无法找到一种简单的表达方式。
吉尔(Gilles)“所以,别再邪恶了”

@mrm号。一条最多可以属于一个循环。一个节点可以属于任意数量的周期:点星形图是单态的(您可以获得更高的每个节点基本周期比率)。Ë = Ñ { 一个b b 一个}nE=in{(a,bi),(bi,a)}
吉尔斯(Gilles)'所以别再邪恶了'

Answers:


10

选择数据表示

首先,查看结果的大小。你想从最短路径集合到所有其他节点。除非路径的平均长度受常数限制(否则不是:任何列表都是单路径,并且如果以为根,则路径的总长度为,其中为列表的长度),则在数据表示中需要格外小心:包含路径的结构将需要使用路径之间的共享。s n n 1 / 2 nssn(n1)/2n

除循环外,从到任何其他节点仅有一条路径。如果该路径经过中间节点,则路径的第一段是从到的所需路径。 ü 牛逼小号ŧsutst

我建议将结果存储在一个数组中,该数组由从到的节点索引,且。数组中的每个元素都存储到该节点的路径上的前一个节点的索引(例如,将用作无法从到达的节点的特殊标记)。从到的路径为。| E | 1 s = 0 1 s s t s = R [ R [ t ] ] R [ R [ t ] ] R [ t ] t 0|E|1s=01sst(s=R[R[t]],,R[R[t]],R[t],t)

遍历图形

将初始化为所有。1R1

从开始执行图的深度优先或宽度优先的遍历。每次到达节点时,将设置为其前任。ü - [R [ ù ]suR[u]

由于存在周期,因此可能会多次到达一个节点。有表示已经被访问。uR[u]1u

证明正确性

由于具有单亲性质,只要我们还没有完成一个循环,到达每个节点就无关紧要。只有一条简单的道路。

证明复杂性

该算法可能多次到达每个节点,因此不清楚其复杂度是否为。实际上完成的工作是,其中是可从源到达的边缘。更确切地说,我们仅在一种情况下多次到达一个节点:如果该节点是在特定循环中我们到达的第一个节点,那么在这种情况下,我们会到达它两次(一次是从一条简单的路径到达,一次是在完成循环之后到达) )。Θ | E 0 |V 0O(|V|)Θ(|E0|)V0

好吧。让我们证明在单向图中,基本循环数最多随节点数线性增长。(基本循环是一个不包含较短循环的循环。)在下面的讨论中,我将假设图没有自边缘(从节点到其自身都没有边;无论如何,这些边与路径构造无关) )。

单态图可以具有周期,但是以非常有限的方式。如果我们能够以某种方式将每个循环关联到一个不同的节点(或至少每个节点至少有一定数量的循环),那将是很好的。循环可以共享一个节点吗?不幸的是。

您可以有个周期全部共享一个节点而没有其他节点。结果图是单感的。对于长度为2的周期,这是一个星形图形,具有一个中心节点和任意数量的节点,使得。一个一个b ∀ 一个b maabii,abi

因此,我们需要更加努力。好吧,让我们尝试归纳证明它。令为图的节点数,为边数,为非自数的基本循环数。我断言,如果是单感的并且不为空,则。ģ#V(G)GÇ ģ ģ Ç ģ V G ^ - 1#E(G)#C(G)G#C(G)#V(G)1

对于具有一个或两个节点的图,这是显而易见的。假设断言适用于所有图,使得并且是具有节点的单态图。如果没有循环,则,关闭大小写。否则,令为基本循环。ģ Ñ#V(G)<nGnG0=#C(G)<#V(G)(a1,,am)

折叠周期:令为图,其节点为减去再加上一个节点且其边缘为所有不涉及的边缘,再加上每当和每当。在每一个路径诱导的路径(如果该路径涉及,然后通过更换这个 G ^ { 一个1... } 一个ģ 一个GG{a1,,am}aGaiaGbi,aiGbbGai,bGaiGGbacbaiai+1ajc在)。因此,是同情的。此外,由于在循环不共享边缘,在所有循环除了我们消除了一个:。通过归纳,。由于,我们有。GGGGGC G '#C(G)=#C(G)1#C(G)#V(G)1#V(G)=#V(G)m+1#C(G)=#C(G)+1#V(G)m=nmn1

这证明了结论。遍历最多边。2|V|2

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.