Floyd-Warshall with Python

유건우·2024λ…„ 9μ›” 24일

μ½”ν…Œμ€€λΉ„

λͺ©λ‘ 보기
13/13

πŸ’‘λ¬Έμ œ

문제 링크 : https://www.acmicpc.net/problem/11404

문제 μ„€λͺ…

  • n(2 ≀ n ≀ 100)개의 λ„μ‹œκ°€ μžˆλ‹€.
  • 그리고 ν•œ λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ λ‹€λ₯Έ λ„μ‹œμ— λ„μ°©ν•˜λŠ” m(1 ≀ m ≀ 100,000)개의 λ²„μŠ€κ°€ μžˆλ‹€.
  • 각 λ²„μŠ€λŠ” ν•œ 번 μ‚¬μš©ν•  λ•Œ ν•„μš”ν•œ λΉ„μš©μ΄ μžˆλ‹€.
  • λͺ¨λ“  λ„μ‹œμ˜ 쌍 (A, B)에 λŒ€ν•΄μ„œ λ„μ‹œ Aμ—μ„œ B둜 κ°€λŠ”λ° ν•„μš”ν•œ λΉ„μš©μ˜ μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

  • 첫째 쀄에 λ„μ‹œμ˜ 개수 n이 μ£Όμ–΄μ§€κ³  λ‘˜μ§Έ μ€„μ—λŠ” λ²„μŠ€μ˜ 개수 m이 μ£Όμ–΄μ§„λ‹€.
  • 그리고 μ…‹μ§Έ 쀄뢀터 m+2μ€„κΉŒμ§€ λ‹€μŒκ³Ό 같은 λ²„μŠ€μ˜ 정보가 μ£Όμ–΄μ§„λ‹€.
  • λ¨Όμ € μ²˜μŒμ—λŠ” κ·Έ λ²„μŠ€μ˜ 좜발 λ„μ‹œμ˜ λ²ˆν˜Έκ°€ μ£Όμ–΄μ§„λ‹€.
  • λ²„μŠ€μ˜ μ •λ³΄λŠ” λ²„μŠ€μ˜ μ‹œμž‘ λ„μ‹œ a, 도착 λ„μ‹œ b, ν•œ 번 νƒ€λŠ”λ° ν•„μš”ν•œ λΉ„μš© c둜 이루어져 μžˆλ‹€.
  • μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œκ°€ 같은 κ²½μš°λŠ” μ—†λ‹€.
  • λΉ„μš©μ€ 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€.
  • μ‹œμž‘ λ„μ‹œμ™€ 도착 λ„μ‹œλ₯Ό μ—°κ²°ν•˜λŠ” 노선은 ν•˜λ‚˜κ°€ 아닐 수 μžˆλ‹€.

좜λ ₯

  • n개의 쀄을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.
  • i번째 쀄에 좜λ ₯ν•˜λŠ” j번째 μˆ«μžλŠ” λ„μ‹œ iμ—μ„œ j둜 κ°€λŠ”λ° ν•„μš”ν•œ μ΅œμ†Œ λΉ„μš©μ΄λ‹€.
  • λ§Œμ•½, iμ—μ„œ j둜 갈 수 μ—†λŠ” κ²½μš°μ—λŠ” κ·Έ μžλ¦¬μ— 0을 좜λ ₯ν•œλ‹€.








β“ν”Œλ‘œμ΄λ“œ μ›Œμ…œμ— λŒ€ν•΄

  • λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ€ ν•œ μ§€μ μ—μ„œ λ‹€λ₯Έ νŠΉμ • μ§€μ κΉŒμ§€μ˜ μ΅œλ‹¨ 경둜λ₯Ό κ΅¬ν•΄μ•Όν•˜λŠ” κ²½μš°μ— μ‚¬μš©ν•  수 μžˆλŠ” μ΅œλ‹¨ 경둜 μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.
  • λͺ¨λ“  μ§€μ μ—μ„œ λ‹€λ₯Έ λͺ¨λ“  μ§€μ κΉŒμ§€μ˜ μ΅œλ‹¨ 경둜λ₯Ό λͺ¨λ‘ κ΅¬ν•΄μ•Όν•˜λŠ” 경우 μ‚¬μš©ν•  수 μžˆλŠ” μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€.








πŸ§‘β€πŸ’» μ½”λ“œ 풀이

import sys

INF = int(1e9)

n = int(sys.stdin.readline())
m = int(sys.stdin.readline())

graph = [[INF] * (n + 1) for _ in range(n + 1)] # 경둜 탐색을 μœ„ν•œ κ·Έλž˜ν”„ 2차원 λ°°μ—΄λ‘œ μ΄ˆκΈ°ν™”

for i in range(1, n + 1):
    for j in range(1, n + 1):
        if i == j:
            graph[i][j] = 0  # 자기 μžμ‹ μœΌλ‘œ κ°€λŠ” 거리 μ΄ˆκΈ°ν™”

for _ in range(m):
    x, y, cost = map(int, sys.stdin.readline().split())
    graph[x][y] = min(graph[x][y], cost)  # graph[x][y] = cost

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])  # λ‹€μŒ 경둜 μ΅œλ‹¨ 거리 κ°±μ‹ 
            # a -> k -> b / a -> b

for i in range(1, n + 1):
    for j in range(1, n + 1):
        if graph[i][j] == INF:
            print('0', end=' ')
        else:
            print(graph[i][j], end=' ')
    print()
profile
βœ…Β μ λ‹Ήν•œ 좔상화λ₯Ό μ°Ύμ•„κ°€λŠ” κ°œλ°œμžμž…λ‹ˆλ‹€.

0개의 λŒ“κΈ€