๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ๋‹จ๊ฑฐ๋ฆฌ (Floyd_Warshall)

Floyd_Warshall

1.Floyd_Warshall ์ด๋ž€

  • ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ '๋ชจ๋“ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์•ผํ•  ๊ฒฝ์šฐ' ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ด์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(n^3)์œผ๋กœ ๋งŽ์€ ๋…ธ๋“œ๊ฐ€ ์ฃผ์–ด์ง„ ๊ฒฝ์šฐ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.
  • ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 1์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ์™€ ๋‹ค๋ฅด๊ฒŒ ๋ชจ๋“  ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ์œ„ํ•ด 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•œ๋‹ค.
  • ์ ํ™”์‹์€ D(a,b) = min(D(a,b), D(a,k) + D(k,b) ์ด๋‹ค. (A์—์„œ B๋กœ๊ฐ€๋Š” ์ตœ์†Œ๋น„์šฉ๊ณผ A์—์„œ K๋ฅผ ๊ฑฐ์ณ B๋กœ ๊ฐ€๋Š” ๋น„์šฉ)์„ ๋น„๊ตํ•˜์—ฌ ๋” ์ž‘์€๊ฐ’์œผ๋กœ ๊ฐฑ์‹ ํ•œ๋‹ค. (์งํ•ญ๊ณผ ๊ฒฝ์œ ์˜ ๋น„๊ต)

2.์˜ˆ์ œ์ฝ”๋“œ


INF = int(1e9)

n = int(input())
m = int(input())

graph = [[INF] * (n + 1) for _ in range(n + 1)]   # ์ดˆ๊ธฐ๊ฐ’์„ ๋ฌดํ•œ๋Œ€๋กœ ๋งŒ๋“  2์ฐจ์› ๋ฆฌ์ŠคํŠธ ์„ ์–ธ

for a in range(1, n+1):   # ์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
  for b in range(1, n+1):
    if a == b:
      graph[a][b] = 0

for _ in range(m):        # a์—์„œ b๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ c๋กœ ์„ค์ •
  a, b, c = map(int, input().split())
  graph[a][b] = c

for k in range(1, n + 1):   # ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
  for a in range(1, n + 1):
    for b in range(1, n + 1):
      graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])     # D(a,b) = min(D(a,b), D(a,k) + D(k,b))

for a in range(1, n + 1):
  for b in range(1, n + 1):
    if graph[a][b] == INF:
      print('INFINIY', end = ' ')
    else:
      print(graph[a][b], end = ' ')
  print()     # ๊ฒฐ๊ณผ๋ฅผ ํ–‰๋ณ„๋กœ ๋„์–ด ์ถœ๋ ฅํ•˜๊ธฐ ์œ„ํ•ด ์„ ์–ธ