각 vertex가 source일 때의 paths를 모두 구하는 알고리즘을 알아보자
Using SSSP algorithms
Single source shortest paths 에서 배운 알고리즘을 이용할 수 있다.
하나의 Single source shortest paths 알고리즘을 각 vertex가 source인 경우로 ∣V∣ 번 실행하면 된다.
Nonnegative-weight edges
Negative-weight edges
- Bellman-Ford algorithm
- O(V⋅VE)=O(V2E)
- 만약 Dense graph (E=O(V2))라면, O(V4) 이다.
Floyd-Warshall algorithm
Dynamic programming을 이용하여 All-pairs shortest paths 를 구하는 알고리즘
필요한 것
-
Adjacency Matrix W
- Edge (i,j)의 weight를 저장: wij=w(i,j)
- Edge가 존재하지 않는다면 ∞

-
Shortest Distance Matrix D
- Vertex i 부터 j 까지의 Shortest Distance를 저장: δ(i,j)
- Self loop가 존재하지 않기 때문에 Diagonal element = 0

-
Predecessor Matrix Π
- πij: i 부터 j의 path가 존재할 때, Vertex j의 Predecessor vertex
- πij=NIL: i 부터 j의 path가 존재하지 않거나, i=j
-
Intermediate Vertex
- Path p = <v1,v2,...,vl> 이 있을 때, v1 과 vl 사이에 존재하는 vertex
- K가 Intermediate vertex of path (i,j) 라고 하면 해당 Path에는 Vertex k가 반드시 포함되어야한다.
초기 세팅
- Distance matrix를 Adjacency matrix로 초기화한다.
- D(0)=W

가정
K: Intermediate vertex 라고 하면 Path (i,j) 에는 다음 두 가지 가정이 존재한다. 
-
K가 Path (i,j)의 Intermidate vertex인 경우
- 이 경우, Path (i,j)를 Path (i,k) 와 Path (k,j) 로 나눌 수 있다.
- dij=dik+dkj
-
K가 Path (i,j)의 Intermidate vertex가 아닌 경우
- 이 경우, 단순히 Path (i,j)를 계산하면 된다.
과정

-
K = 1 to N까지 각 K에 대해dij(k)=min(dij(k−1),dik(k−1)+dkj(k−1)) 을 수행한다.
-
(1) 의 결과를 D(k)에 저장한다.
-
K = N 이라면 알고리즘을 종료한다.
Pseudo code
FLOYD-WARSHALL(W)
1. n = W.rows
2. D^0 = W
3. for k = 1 to n
4. let D(k) = (d_ij(k)) be a new n x n matrix
5. for i = 1 to n
6. for j = 1 to n
7. d_ik(k) = min(d_ij(k-1), d_ik(k-1) + d_kj(k-1))
8. return D(n)
PRINT-ALL-PAIRS-SHORTEST-PATH(Π, i, j)
1. if i == j
2. print i
3. else if π_ij == NIL
4. print "no path form" i "to" j "exists"
5. else PRINT-ALL-PAIRS-SHORTEST-PATH(Π, i, π_ij)
6. print j
Running time
- Line 7: O(1)
- Total Running time: θ(V3)
- Line 7이 n3번 호출되기 때문이다.
Predecessor matrix로 Shortest path 계산

- (k)의 의미는 k를 거쳐갔을 때를 가정한다는 의미이고 Π는 j의 직전 vertex를 의미한다.
Transitive closure of Graph
Directed graph G=(V,E) 에 대해 Transitive closure of G∗=(V,E∗)
- E∗: Path (i,j) 를 구성하는 Egde의 집합