- λ°±μ€ 'νμλ¨Έμ ' λ¬Έμ : https://www.acmicpc.net/problem/11657
- Nκ°μ λμκ° μλ€. κ·Έλ¦¬κ³ ν λμμμ μΆλ°νμ¬ λ€λ₯Έ λμμ λμ°©νλ λ²μ€κ° Mκ° μλ€. κ° λ²μ€λ A,B,Cλ‘ λνλΌ μ μλλ° Aλ μμλμ, Bλ λμ°©λμ, Cλ λ²μ€λ₯Ό νκ³ μ΄λνλλ° κ±Έλ¦¬λ μκ°μ΄λ€. μκ° Cκ° μμκ° μλ κ²½μ°κ° μλ€. C = 0μΈ κ²½μ°μλ μκ° μ΄λμ νλ κ²½μ°, C < 0μΈ κ²½μ°λ νμλ¨Έμ μΌλ‘ μκ°μ λλμκ°λ κ²½μ°μ΄λ€. 1λ² λμμμ μΆλ°ν΄μ λλ¨Έμ§ λμλ‘ κ°λ κ°μ₯ λΉ λ₯Έ μκ°μ ꡬνλ νλ‘κ·Έλ¨μ μμ±νλΌ
- λμμ κ°μ : N(1 <= N <= 500)
- λ²μ€ λ Έμ μ κ°μ : M(1<= M <= 6000)
-
μμ κ°μ μ κ΄νμ¬ μ΅λ¨ κ²½λ‘ λ¬Έμ λ λ€μκ³Ό κ°μ΄ λΆλ₯ν μ μλ€
- λͺ¨λ κ°μ μ΄ μμμΈ κ²½μ°
- μμ κ°μ μ΄ μλ κ²½μ°
- μμ κ°μ μνμ μλ κ²½μ°
- μμ κ°μ μνμ΄ μλ κ²½μ°
-
λ²¨λ§ ν¬λ μ΅λ¨ κ²½λ‘ μκ³ λ¦¬μ¦μ μμ κ°μ μ΄ ν¬ν¨λ μν©μμλ μ¬μ©ν μ μλ€
- λν μμ κ°μ μ μνμ κ°μ§ν μ μλ€
- λ²¨λ§ ν¬λμ κΈ°λ³Έ μκ° λ³΅μ‘λλ O(VE)λ‘ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ λΉν΄ λ리λ€
-
λ²¨λ§ ν¬λ μκ³ λ¦¬μ¦μ λ€μκ³Ό κ°λ€
- μΆλ° λ Έλλ₯Ό μ€μ νλ€
- μ΅λ¨ 거리 ν μ΄λΈμ μ΄κΈ°ννλ€
- λ€μμ κ³Όμ μ N - 1λ² λ°λ³΅νλ€
- μ 체 κ°μ Eκ°λ₯Ό νλμ© νμΈνλ€
- κ° κ°μ μ κ±°μ³ λ€λ₯Έ λ Έλλ‘ κ°λ λΉμ©μ κ³μ°νμ¬ μ΅λ¨ 거리 ν μ΄λΈμ κ°±μ νλ€
-
λ§μ½ μμ κ°μ μνμ΄ λ°μνλμ§ μ²΄ν¬νκ³ μΆλ€λ©΄ 3λ²μ κ³Όμ μ ν λ² λ μννλ€
- μ΄λ μ΅λ¨ 거리 ν μ΄λΈμ΄ κ°±μ λλ€λ©΄ μμ κ°μ μνμ΄ μ‘΄μ¬νλ κ²μ΄λ€
- λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦
- λ§€λ² λ°©λ¬Ένμ§ μμ λ Έλ μ€μμ μ΅λ¨ κ±°λ¦¬κ° κ°μ₯ μ§§μ λ Έλλ₯Ό μ ννλ€
- μμ κ°μ μ΄ μλ€λ©΄ μ΅μ μ ν΄λ₯Ό μ°Ύμ μ μλ€
- λ²¨λ§ ν¬λ μκ³ λ¦¬μ¦
- λ§€λ² λͺ¨λ κ°μ μ μ λΆ νμΈνλ€
- λ°λΌμ λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μμμ μ΅μ μ ν΄λ₯Ό νμ ν¬ν¨νλ€
- λ€μ΅μ€νΈλΌ μκ³ λ¦¬μ¦μ λΉν΄μ μκ°μ΄ μ€λ 걸리μ§λ§ μμ κ°μ μνμ νμ§ν μ μλ€
- λ§€λ² λͺ¨λ κ°μ μ μ λΆ νμΈνλ€
import sys
input = sys.stdin.readline
INF = int(1e9) # 무νμ μλ―Ένλ κ°μΌλ‘ 10μ΅μ μ€μ
def bf(start):
# μμ λ
Έλμ λν΄μ μ΄κΈ°ν
dist[start] = 0
# μ 체 nλ²μ λΌμ΄λ(round)λ₯Ό λ°λ³΅
for i in range(n):
# λ§€ λ°λ³΅λ§λ€ "λͺ¨λ κ°μ "μ νμΈνλ©°
for j in range(m):
cur = edges[j][0]
next_node = edges[j][1]
cost = edges[j][2]
# νμ¬ κ°μ μ κ±°μ³μ λ€λ₯Έ λ
Έλλ‘ μ΄λνλ κ±°λ¦¬κ° λ μ§§μ κ²½μ°
if dist[cur] != INF and dist[next_node] > dist[cur] + cost:
dist[next_node] = dist[cur] + cost
# nλ²μ§Έ λΌμ΄λμμλ κ°μ΄ κ°±μ λλ€λ©΄ μμ μνμ΄ μ‘΄μ¬
if i == n - 1:
return True
return False
# λ
Έλμ κ°μ, κ°μ μ κ°μ μ
λ ₯λ°κΈ°
n, m = map(int, input().split())
# λͺ¨λ κ°μ μ λν μ 보λ₯Ό λ΄λ 리μ€νΈ λ§λ€κΈ°
edges = []
# μ΅λ¨ 거리 ν
μ΄λΈμ λͺ¨λ 무νμΌλ‘ μ΄κΈ°ν
dist = [INF] * (n+1)
# λͺ¨λ κ°μ μ 보λ₯Ό μ
λ ₯λ°κΈ°
for _ in range(m):
a,b,c = map(int, input().split())
# aλ² λ
Έλμμ bλ² λ
Έλλ‘ κ°λ λΉμ©μ΄ cλΌλ μλ―Έ
edges.append((a,b,c))
# λ²¨λ§ ν¬λ μκ³ λ¦¬μ¦μ μν
negative_cycle = bf(1) # 1λ² λ
Έλκ° μμ λ
Έλ
if negative_cycle:
print("-1")
else:
# 1λ² λ
Έλλ₯Ό μ μΈν λ€λ₯Έ λͺ¨λ λ
Έλλ‘ κ°κΈ° μν μ΅λ¨ 거리 μΆλ ₯
for i in range(2, n+1):
# λλ¬ν μ μλ κ²½μ°, -1μ μΆλ ₯
if dist[i] == INF:
print("-1")
# λλ¬ν μ μλ κ²½μ° κ±°λ¦¬λ₯Ό μΆλ ₯
else:
print(dist[i])