Amenable
Amenable's Blog
Amenable
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (189)
    • ๐Ÿ“‚ JAVA (87)
      • ์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ” (65)
      • ์ฃผ์š” ๊ฐœ๋… (22)
    • ๐Ÿ“‚ ๊ฐœ๋ฐœ ์„œ์  (22)
      • ์‹ค์šฉ์ฃผ์˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ (1)
      • ๊ฐ์ฒด์ง€ํ–ฅ์˜ ์‚ฌ์‹ค๊ณผ ์˜คํ•ด (2)
      • ํด๋ฆฐ ์ฝ”๋“œ (8)
      • ํ•จ๊ป˜ ์ž๋ผ๊ธฐ (1)
      • ๊ทธ๋ฆผ์œผ๋กœ ๋ฐฐ์šฐ๋Š” HTTP&Network Basic (10)
    • ๐Ÿ“‚ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค (8)
      • ๊ฐœ๋… (8)
      • ๋ฌธ์ œํ’€์ด (0)
    • ๐Ÿ“‚ ๋„คํŠธ์›Œํฌ (14)
      • ๊ฐœ๋… (6)
      • ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” 1%์˜ ๋„คํŠธ์›Œํฌ ์›๋ฆฌ (8)
    • ๐Ÿ“‚ ์Šคํ”„๋ง (13)
      • ๊ธฐ๋ณธ ๊ฐœ๋… (13)
    • ๐Ÿ“‚ WEB (5)
    • ๐Ÿ“‚ ์ž๋ฃŒ๊ตฌ์กฐ (12)
      • ๊ฐœ๋… (2)
      • ์ •๋ ฌ (8)
      • ํŠธ๋ฆฌ (2)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (10)
      • ์ตœ์†Œ์‹ ์žฅํŠธ๋ฆฌ (2)
      • ์ตœ๋‹จ ๊ฒฝ๋กœ (2)
      • ๋ฌธ์ž์—ด (2)
      • ETC (4)
    • ๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜_๋ฌธ์ œํ’€์ด (4)
      • BOJ_๋ฐฑ์ค€ (4)
    • ๐Ÿ“‚ ํ”„๋กœ๊ทธ๋ž˜๋ฐ (3)
    • ๐Ÿ“‚ DevOps (2)
      • ๋ฐฐํฌ (2)
    • ๐Ÿ“‚ ํ›„๊ธฐ (8)
      • ์šฐ์•„ํ•œ ํ…Œํฌ์ฝ”์Šค(ํ”„๋ฆฌ์ฝ”์Šค) (4)
      • 2023๋…„ (3)
      • 2024๋…„ (1)
    • ๐Ÿ“‚ ํšŒ๊ณ  (1)
      • 2023๋…„ (1)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ๐Ÿš€ GitHub

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
Amenable

Amenable's Blog

ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ(Floyd-Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜
๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์ตœ๋‹จ ๊ฒฝ๋กœ

ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ(Floyd-Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜

2023. 4. 3. 21:16

1. ๊ฐœ๋… ๐Ÿ•‍๐Ÿฆบ

  ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ(Floyd-Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€ ๋ชจ๋“  ์ •์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋‹ค๋ฅด๊ฒŒ ์Œ์˜ ๊ฐ€์ค‘์น˜๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒŒ ํŠน์ง•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

  ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜์ž๋ฉด ์ถœ๋ฐœ ์ •์ ์œผ๋กœ๋ถ€ํ„ฐ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ์ด์šฉํ•˜์—ฌ ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ถœ๋ฐœ ์ •์ ์„ ๋ชจ๋“  ์ •์ ์˜ ๊ฐœ์ˆ˜๋งŒํผ ์„ค์ •ํ•ด ์ฃผ๋ฉด ๋œ๋‹ค.

  ์ˆœ์ฐจ ํƒ์ƒ‰ ๋ฐฉ๋ฒ•์œผ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด O(V^2)์ด๊ณ , ๋ชจ๋“  ์ •์ ์„ ์ถœ๋ฐœ ์ •์ ์œผ๋กœ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด O(V * V^2) = O(V^3)์ด ๋˜๊ฒŒ ๋œ๋‹ค. ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„ ๋˜ํ•œ O(V^3)์œผ๋กœ ๊ฐ™๋‹ค. ํ•˜์ง€๋งŒ ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„์€ ๋‹ค์ต์ŠคํŠธ๋ผ์— ๋น„ํ•ด ๋งค์šฐ ๊ฐ„๋‹จํ•˜๋ฏ€๋กœ ํ•ด๋‹น ๋ฐฉ๋ฒ•์„ ์ตํ˜€๋†“๋„๋ก ํ•˜์ž.

 

2. ๋™์ž‘๋ฐฉ์‹ ๐Ÿ•

  ํ”Œ๋กœ์ด๋“œ-์™€์ƒฌ์€ DP๋ฅผ ์ด์šฉํ•œ๋‹ค. 

  DP[i][j][k]๋Š” ์ •์  {1, 2,..., k}๋งŒ์„ ๊ฒฝ์œ  ๊ฐ€๋Šฅํ•œ ์ •์ ๋“ค๋กœ ์ƒ๊ฐํ•˜๊ณ , ์ •์  i๋กœ๋ถ€ํ„ฐ ์ •์  j๊นŒ์ง€์˜ ๋ชจ๋“  ๊ฒฝ๋กœ ์ค‘ ๊ฐ€์žฅ ์งง์€ ๊ฒฝ๋กœ์˜ ๊ฑฐ๋ฆฌ์ด๋‹ค. ์ด๋•Œ, {1, 2,..., k}์— ์†ํ•œ ๋ชจ๋“  ์ •์ ๋“ค์„ ๋ฐ˜๋“œ์‹œ ๊ฒฝ์œ ํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๊ฒฝ์œ ๋ฅผ ํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์•ˆ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์— ์ฃผ์˜ํ•˜์ž.

  ๊ทธ๋Ÿฌ๋ฉด DP[i][j][k]์€ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ? DP[i][j][k] = min(DP[i][j][k-1], DP[i][k][k-1] + DP[k][j][k-1])๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค. 

  • DP[i][j][k-1] : ์›์†Œ k๋ฅผ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  {1, 2,..., k-1}์˜ ์›์†Œ๋งŒ ๊ณ ๋ คํ•œ ๊ฒฝ์šฐ
  • DP[i][k][k-1] + DP[k][j][k-1] : {1, 2,..., k-1}์˜ ์›์†Œ๋ฅผ ๊ณ ๋ คํ•˜์˜€์ง€๋งŒ k๋ฅผ ๊ฒฝ์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฒฐ๊ตญ {1, 2,..., k}๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒฝ์šฐ

  ์ฆ‰, DP[i][j][k]๋Š” '{1, 2,..., k-1}๋งŒ ๊ณ ๋ คํ•œ ๊ฒฝ์šฐ'์™€ 'k๋ฅผ ๋ฌด์กฐ๊ฑด ํฌํ•จํ•˜๊ณ  {1, 2,..., k}๋ฅผ ๊ณ ๋ คํ•˜๋Š” ๊ฒฝ์šฐ' ์ค‘์— ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด๋‹ค. (DP์˜ ์›๋ฆฌ๋ฅผ ์•Œ๊ณ  ์žˆ๋‹ค๋ฉด ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.)
  ์ด๋ฅผ ์ฝ”๋“œ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

V ← Vertext
for k ← 1 to n
  for i ← 1 to n (i != k)
    for j ← 1 to n ( j != k , j != i)
      DP[i][j] = min(DP[i][j], DP[i][k] + DP[k][j]);

  3์ฐจ์› ๋ฐฐ์—ด๋กœ ์ƒ๊ฐํ–ˆ์ง€๋งŒ 2์ฐจ์›์œผ๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ? ๋ฐ”๋กœ k๊ฐ€ ๋ฐ˜๋ณต๋ฌธ์„ ๋Œ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. DP[i][j] = Math.min(DP[i][j], DP[i][k] + DP[k][j])์—์„œ ์ขŒํ•ญ์€ {1, 2,..., k}๊นŒ์ง€ ๊ณ ๋ คํ•œ DP์ด๊ณ  ์šฐํ•ญ์€ {1, 2,..., k-1}๊นŒ์ง€ ๊ณ ๋ คํ•œ DP์ด๋‹ค. 'k๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋„๋Š” ๊ฒƒ'๊ณผ 'i, j, k๊ฐ€ ๊ฐ™์€ ์ƒํ™ฉ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๋Š” ๊ฒƒ' ๋•Œ๋ฌธ์— 3์ฐจ์› ๋ฐฐ์—ด์ด ์•„๋‹Œ 2์ฐจ์› ๋ฐฐ์—ด๋งŒ ์‚ฌ์šฉํ•ด์„œ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

3. ๊ตฌํ˜„(JAVA) ๐Ÿฆฎ

  ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๊ฐ€์ค‘์น˜๋Š” 0์œผ๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ดˆ๊ธฐ ๊ฐ’์˜ ๊ฒฝ์šฐ ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฒฝ๋กœ์˜ ๊ฐ€์ค‘์น˜๋กœ, ๊ฒฝ๋กœ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด INF(๋ฌดํ•œ๋Œ€)๋กœ ์„ค์ •ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ์ง€ k๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ๋น„๊ตํ•  ๋•Œ ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฐ’์œผ๋กœ ๋ณ€๊ฒฝ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๋•Œ (INF+INF)๋“ฑ์œผ๋กœ ์ธํ•ด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋‚˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

[์ž…๋ ฅ๋ฐ์ดํ„ฐ]
0 3 8 0 -4
0 0 0 1 7
0 4 0 0 0
2 0 -5 0 0
0 0 0 6 0
static final int INF = 999999;
static int V;
static int[][] DP;
static String[] ss;

public static void main(String[] args) throws IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

    V = 5;
    DP = new int[V][V];

    for(int i = 0; i < V; i++) {
        ss = in.readLine().split(" ");
        for(int j = 0; j < V; j++) {
            DP[i][j] = Integer.parseInt(ss[j]);
            // ๊ฒฝ๋กœ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ
            if((i != j) && (DP[i][j] == 0)) {
                DP[i][j] = INF;
            }
        }
    }

    for(int k = 0; k < V; k++) {
        for(int i = 0; i < V; i++) {
            if(i == k)
                continue;
            for(int j = 0; j < V; j++) {
                if((j == k) || (j == i))
                    continue;

                DP[i][j] = Math.min(DP[i][j], DP[i][k] + DP[k][j]);
            }
        }
    }

    for(int i = 0; i < V; i++) {
        for(int j = 0; j < V; j++) {
            System.out.print(DP[i][j] + " ");
        }
        System.out.println();
    }
}
[์ถœ๋ ฅ๋ฐ์ดํ„ฐ]
0 1 -3 2 -4
3 0 -4 1 -1
7 4 0 5 3
2 -1 -5 0 -2
8 5 1 6 0

'๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜ > ์ตœ๋‹จ ๊ฒฝ๋กœ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜  (0) 2023.03.04
    '๐Ÿ“‚ ์•Œ๊ณ ๋ฆฌ์ฆ˜/์ตœ๋‹จ ๊ฒฝ๋กœ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜
    Amenable
    Amenable
    CS, ์ž๋ฐ”, ์ž๋ฃŒ๊ตฌ์กฐ, ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์Šคํ”„๋ง, ์Šคํ”„๋ง ๋ถ€ํŠธ์— ํ•ด๋‹นํ•˜๋Š” ๊ฐœ๋ฐœ์— ๊ด€ํ•œ ๋‚ด์šฉ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”