πŸ“Œ About

floyd-warshall gif.gif

Dijkstra μ•Œκ³ λ¦¬μ¦˜μ΄ ν•˜λ‚˜μ˜ μ •μ μ—μ„œ λ‹€λ₯Έ μ •μ λ“€λ‘œ κ°€λŠ” μ΅œλ‹¨ 거리λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λΌλ©΄ Floyd-Warshall μ•Œκ³ λ¦¬μ¦˜μ€ λͺ¨λ“  μ •μ μ—μ„œ λ‹€λ₯Έ λͺ¨λ“  μ •μ λ“€λ‘œ κ°€λŠ” μ΅œλ‹¨ 거리λ₯Ό κ΅¬ν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

πŸ“Œ Algorithm

Step 1. Graphλ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€. (Self = 0, Null = INF)

Step 2. Node nλ²ˆμ„ κ²½μœ ν•  λ•Œ 더 짧게 갈 수 μžˆλŠ” 경우λ₯Ό μ—…λ°μ΄νŠΈν•œλ‹€. (λͺ¨λ“  nodeλ₯Ό 탐색)

πŸ“Œ Java Code

private static int N;
private static int[][] infos;

private static void floydWarshall() {
    for (int mid = 1; mid <= N; mid++)
        for (int start = 1; start <= N; start++)
            for (int end = 1; end <= N; end++) {
                if (infos[start][end] > infos[start][mid] + infos[mid][end])
                    infos[start][end] = infos[start][mid] + infos[mid][end];
            }
}

πŸ“Œ Example

Step 1. Graphλ₯Ό μ΄ˆκΈ°ν™”ν•œλ‹€.

Untitled

N-to-N은 0 이닀.

μ΄μ›ƒν•˜μ§€ μ•ŠμœΌλ©΄ INF 이닀.

Step 2-1. Node 1을 κ²½μœ ν•˜λŠ” 경우λ₯Ό νƒμƒ‰ν•œλ‹€.

Untitled

3 β†’ 1 β†’ 2의 λΉ„μš©μ€ 10이닀.

기쑴의 3 β†’ 2의 λΉ„μš©μ€ INF이닀.

더 μž‘μ€ 값인 10을 μ €μž₯ν•œλ‹€.

Untitled

5 β†’ 1 β†’ 3의 λΉ„μš©μ€ 10이닀.

기쑴의 5 β†’ 3의 λΉ„μš©μ€ INF이닀.

더 μž‘μ€ 값인 10을 μ €μž₯ν•œλ‹€.

Untitled

5 β†’ 1 β†’ 4의 λΉ„μš©μ€ 8이닀.

기쑴의 5 β†’ 4의 λΉ„μš©μ€ INF이닀.

더 μž‘μ€ 값인 8을 μ €μž₯ν•œλ‹€.

Step 2-2. Node 2λ₯Ό κ²½μœ ν•˜λŠ” 경우λ₯Ό νƒμƒ‰ν•œλ‹€.

Untitled

5 β†’ 2 β†’ 4의 λΉ„μš©μ€ 6이닀.

기쑴의 5 β†’ 4의 λΉ„μš©μ€ 8이닀.

더 μž‘μ€ 값인 6을 μ €μž₯ν•œλ‹€.

Step 2-3. Node 3을 κ²½μœ ν•˜λŠ” 경우λ₯Ό νƒμƒ‰ν•œλ‹€.

Untitled

1 β†’ 3 β†’ 5의 λΉ„μš©μ€ 4이닀.

기쑴의 1 β†’ 5의 λΉ„μš©μ€ 10이닀.

더 μž‘μ€ 값인 4λ₯Ό μ €μž₯ν•œλ‹€.

Step 2-4. Node 4λ₯Ό κ²½μœ ν•˜λŠ” 경우λ₯Ό νƒμƒ‰ν•œλ‹€.