Floyd-Warshall

From Algowiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

Abstract View

Algorithmic problem: All pairs shortest paths

Prerequisites: None

Type of algorithm: loop

Auxilliary data:

  1. A constant representing the number of node: [math]\displaystyle{ n = |V| }[/math]
  2. A real-valued [math]\displaystyle{ (n \times n) }[/math] matrix [math]\displaystyle{ M }[/math]
  3. An ordering of all nodes, that is, [math]\displaystyle{ V = \{u_1, \ldots ,u_n\} }[/math]

Notation: On this page, [math]\displaystyle{ M^i }[/math] refers to the contents of [math]\displaystyle{ M }[/math] after [math]\displaystyle{ i\geq 0 }[/math] iterations.

Invariant: After [math]\displaystyle{ i \ge 0 }[/math] iterations, for [math]\displaystyle{ v,w \in V }[/math], [math]\displaystyle{ M(v,w) }[/math] is the length of a shortest [math]\displaystyle{ (v,w) }[/math]-path subject to the constraint that all internal nodes of the path belong to [math]\displaystyle{ \{u_1, \ldots , u_i\} }[/math].

Variant: [math]\displaystyle{ i }[/math] increases by [math]\displaystyle{ 1 }[/math].

Break condition: It is [math]\displaystyle{ i=n }[/math]

Induction basis

Abstract view: For all [math]\displaystyle{ v,w \in V }[/math] we set

  1. [math]\displaystyle{ M(v,v):=0, \forall v \in V }[/math]
  2. [math]\displaystyle{ M(v,w):=l(v,w), (v,w) \in A }[/math]
  3. [math]\displaystyle{ M(v,w):= +\infty }[/math], otherwise

Implementation: Obvious.

Proof: Nothing to show.

Induction step

Abstract view: Bring [math]\displaystyle{ v_i }[/math] into the game.

Implementation: For all [math]\displaystyle{ v,w\in V }[/math], set [math]\displaystyle{ M^{i+1}(v,w):=\min\{M^i(v,w),M^i(v,u_i)+M^i(u_i,w)\} }[/math].

Correctness: Let [math]\displaystyle{ p }[/math] denote a shoortest [math]\displaystyle{ (v,w }[/math]-path subject to the constraint that all internal nodes are taken from [math]\displaystyle{ \{u_1, \ldots, u_n \} }[/math].

  1. If [math]\displaystyle{ p }[/math] does not contain [math]\displaystyle{ u_i }[/math], [math]\displaystyle{ p }[/math] is even a shortest [math]\displaystyle{ (v,w) }[/math]-path such that all internal nodes are taken from [math]\displaystyle{ \{u_1, \ldots , u_{i-1} \} }[/math]. In this case, the induction hypothesis implies that the value of [math]\displaystyle{ M(v,w) }[/math] immediately before the i-th iteration equals the length of [math]\displaystyle{ p }[/math]. Clearly, the i-th iteration does not change the value of [math]\displaystyle{ M(v,w) }[/math] in this case.
  2. On the other hand, suppose [math]\displaystyle{ p }[/math] does contain [math]\displaystyle{ u_i }[/math]. Due to the prefix property, the segment of [math]\displaystyle{ p }[/math] from [math]\displaystyle{ v }[/math] to [math]\displaystyle{ u_i }[/math] and from [math]\displaystyle{ u_i }[/math] to [math]\displaystyle{ w }[/math] are a shortest [math]\displaystyle{ (v,u_i) }[/math]-path and a shortest [math]\displaystyle{ (u_i,w) }[/math]-path, respectively, subject to the constraint that all internal nodes are from [math]\displaystyle{ \{u_1, \ldots , u_{i-1} \} }[/math]. The induction hypothesis implies that tehese lengths equal the values [math]\displaystyle{ M(v,u_i) }[/math] and [math]\displaystyle{ M(u_i, w) }[/math], respectively.

Complexity

Statement: [math]\displaystyle{ \mathcal{O}(n^3) }[/math]

Proof: The overall loop has [math]\displaystyle{ n }[/math] iterations. In each iteration, we update all [math]\displaystyle{ n^2 }[/math] matrix entities. Each update requires a constant number of steps.