[Python] G4_11404_ν”Œλ‘œμ΄λ“œ 🚌

Sangho HanΒ·2023λ…„ 7μ›” 12일
post-thumbnail

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을 좜λ ₯ν•œλ‹€.

예제

쑰건

  • μ‹œκ°„ μ œν•œ: 1초
  • λ©”λͺ¨λ¦¬ μ œν•œ: 256MB

import sys
input = sys.stdin.readline
INF = sys.maxsize
# Input
V = int(input())
E = int(input())
dp = [[INF]*V for _ in range(V)]
for i in range(V):
    dp[i][i] = 0
# 초기 λ…Έμ„  정보λ₯Ό μ €μž₯
for _ in range(E):
    u,v,w = map(int,input().split())
    if dp[u-1][v-1] == INF:
        dp[u-1][v-1] = w
    # μ€‘λ³΅λœ 정보일 경우, 더 μž‘μ€ 값을 λ„£μ–΄μ€Œ
    else:
        dp[u-1][v-1] = min(dp[u-1][v-1],w)
# ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜   
for k in range(V):
    for i in range(V):
        for j in range(V):
            if dp[i][j] > dp[i][k] + dp[k][j]:
                dp[i][j] = dp[i][k] + dp[k][j]
# Output                
for row in dp:
    for i in range(V):
        # 갈 수 μ—†λŠ” 경우
        if row[i] == INF:
            row[i] = 0
    print(*row)

이 λ¬Έμ œλŠ” λ…Έλ“œμ™€ λ…Έλ“œ κ°„ μ΅œλ‹¨ 거리λ₯Ό ꡬ할 수 μžˆλŠ” ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œμ΄λ‹€.

  • λ…Έλ“œμ˜ 개수 V, κ°„μ„ μ˜ 개수 E, λ…Έλ“œ κ°„ μ΅œλ‹¨ 거리λ₯Ό μ €μž₯ν•  dp λ₯Ό μ„€μ •ν•œλ‹€.

  • λ³ΈμΈμ—μ„œ 본인으둜의 κ±°λ¦¬λŠ” 0이기에 0을 μ €μž₯ν•΄μ€€λ‹€.
    for i in range(V): dp[i][i] = 0

초기 λ…Έμ„  정보λ₯Ό μ €μž₯ν•΄μ€€λ‹€.

  • μž…λ ₯은 1λΆ€ν„° λ“€μ–΄μ˜€κΈ°μ—, -1μ”© ν•œ μƒνƒœλ‘œ κ°€μ€‘μΉ˜λ₯Ό λ„£μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€.

  • λ˜ν•œ, μ‹œμž‘ λ…Έλ“œμ™€ 도착 λ…Έλ“œκ°€ 같은 간선이 λ“€μ–΄μ˜¬ 수 있기 λ•Œλ¬Έμ—, κ°€μ€‘μΉ˜κ°€ 더 μž‘μ€ κ°’μœΌλ‘œ λ„£μ–΄μ£Όμ–΄μ•Ό ν•œλ‹€.

ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ μ‹€ν–‰ν•œλ‹€.

  • kλŠ” 쀑간에 κ±°μ³μ„œ 갈 λ…Έλ“œ, iλŠ” μ‹œμž‘ λ…Έλ“œ, jλŠ” 도착 λ…Έλ“œλ₯Ό μ˜λ―Έν•œλ‹€.

  • 즉 iμ—μ„œ j둜 λ°”λ‘œ κ°€λŠ” 것보닀, kλ₯Ό 쀑간에 ν•œ 번 κ±°μ³μ„œ κ°€λŠ” 것이 더 κ°€μ€‘μΉ˜κ°€ 적닀면 κ·Έ κ°’μœΌλ‘œ λ³€κ²½ν•΄μ£ΌλŠ” 것이닀.

  • if dp[i][j] > dp[i][k] + dp[k][j]: dp[i][j] = dp[i][k] + dp[k][j]

μ΅œμ’…μ μœΌλ‘œ κ²°μ •λœ λ…Έλ“œ κ°„μ˜ μ΅œλ‹¨ 거리(=κ°€μ€‘μΉ˜)λ₯Ό 좜λ ₯ν•΄μ€€λ‹€.

  • λ…Έλ“œ κ°„ 이동이 λΆˆκ°€ν•΄, μ—¬μ „νžˆ INF값이 λ“€μ–΄μžˆλŠ” κ²½μš°κ°€ μžˆμœΌλ―€λ‘œ 이 λ•ŒλŠ” 0으둜 λ³€κ²½ν•΄μ„œ 좜λ ₯ν•΄μ€€λ‹€.

λŠλ‚€ 점 & 배운 점

  1. ν”Œλ‘œμ΄λ“œ-μ›Œμ…œ μ•Œκ³ λ¦¬μ¦˜μ„ 처음 μ‚¬μš©ν•΄λ³΄μ•˜λŠ”λ°, μ–΄λ €μ›Œλ³΄μ˜€μ§€λ§Œ 생각보닀 κ°„λ‹¨ν•œ κ΅¬μ‘°λΌμ„œ μ‰½κ²Œ ν™œμš©ν•  수 μžˆμ—ˆλ‹€.

  2. 당뢄간은 λΉ„μŠ·ν•œ 문제λ₯Ό ν’€λ©΄μ„œ μŠ΅λ“ν•΄λ‚˜κ°ˆ μ˜ˆμ •μ΄λ‹€!

profile
λΈ”λ‘œκ·Έ 이관 μ€‘μž…λ‹ˆλ‹€: https://bbbang105.github.io/

0개의 λŒ“κΈ€