
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μΌλ‘ λ³κ²½ν΄μ μΆλ ₯ν΄μ€λ€.λλ μ & λ°°μ΄ μ
νλ‘μ΄λ-μμ μκ³ λ¦¬μ¦μ μ²μ μ¬μ©ν΄λ³΄μλλ°, μ΄λ €μ보μμ§λ§ μκ°λ³΄λ€ κ°λ¨ν ꡬ쑰λΌμ μ½κ² νμ©ν μ μμλ€.
λΉλΆκ°μ λΉμ·ν λ¬Έμ λ₯Ό νλ©΄μ μ΅λν΄λκ° μμ μ΄λ€!