플로이드 워셜

빠른 설명

플로이드 워셜은 모든 정점 쌍 사이의 최단거리를 구하는 알고리즘이다. 중간 정점 를 거쳐 가는 경우를 하나씩 허용하며 거리를 갱신한다.

언제 쓰는가

  • 모든 정점 쌍의 최단거리가 필요할 때
  • 정점 수가 작을 때
  • 음수 간선은 있지만 음수 사이클은 없을 때

시간복잡도

  • 메모리

참고자료

C++ 코드

#include <algorithm>
#include <deque>
#include <functional>
#include <iostream>
#include <queue>
#include <stack>
#include <string>
#include <utility>
#include <vector>
using namespace std;
 
const int INF = 1e9;
 
int main() {
    int n = 4;
    vector<vector<int>> dist(n, vector<int>(n, INF));
 
    for (int i = 0; i < n; i++) dist[i][i] = 0;
 
    dist[0][1] = 3;
    dist[0][2] = 10;
    dist[1][2] = 2;
    dist[2][3] = 1;
 
    for (int k = 0; k < n; k++) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (dist[i][k] == INF || dist[k][j] == INF) continue;
                dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
            }
        }
    }
 
    cout << dist[0][3] << '\n';
}

Python 코드

INF = 10**9
n = 4
dist = [[INF] * n for _ in range(n)]
 
for i in range(n):
    dist[i][i] = 0
 
dist[0][1] = 3
dist[0][2] = 10
dist[1][2] = 2
dist[2][3] = 1
 
for k in range(n):
    for i in range(n):
        for j in range(n):
            if dist[i][k] == INF or dist[k][j] == INF:
                continue
            dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j])
 
print(dist[0][3])