https://www.acmicpc.net/problem/11657
11657๋ฒ: ํ์๋จธ์
์ฒซ์งธ ์ค์ ๋์์ ๊ฐ์ N (1 ≤ N ≤ 500), ๋ฒ์ค ๋ ธ์ ์ ๊ฐ์ M (1 ≤ M ≤ 6,000)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ M๊ฐ์ ์ค์๋ ๋ฒ์ค ๋ ธ์ ์ ์ ๋ณด A, B, C (1 ≤ A, B ≤ N, -10,000 ≤ C ≤ 10,000)๊ฐ ์ฃผ์ด์ง๋ค.
www.acmicpc.net
์ฒ์์ ์์ ๋ฅผ ๋ด๋ ๋ฌธ์ ๊ฐ ์ดํด๊ฐ ์ ์ ๊ฐ์๋ค.
๊ทธ๋์ ๊ด๋ จ ๊ธ๋ค์ ์ฐพ์๋ณด๋ค๊ฐ,, ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ผ๋ ๊ฒ์ ์์๋ค.
์ด ๋ฌธ์ ๋ ์์ ๊ฐ์ ์ด ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ฌ์ดํด์ ์ํํ ์๋ก ๊ฐ์ค์น๊ฐ ๊ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ ์ ์๊ณ , ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์ด์ผ ํ๋ค.
์์ 2๋ฅผ ๋ณด๋ฉด ์ฌ์ดํด์ ๊ณ์ ์ํํ๋ฉด ๊ฐ์ค์น๊ฐ ๊ณ์ํด์ ๊ฐ์ํ์ฌ ์๊ฐ์ ๋ฌดํ์ผ๋ก ๋๋๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ -1์ ์ถ๋ ฅํ๋ค.
๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๋งค๋ฒ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ์ฌ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ณ
๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋งค ๋จ๊ณ๋ง๋ค ๋ชจ๋ ๊ฐ์ ์ ์ ๋ถ ํ์ธํ๋ฉด์ ๋ชจ๋ ๋ ธ๋๊ฐ์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค.
๋ฐ๋ผ์ ๋ฒจ๋ง-ํฌ๋ ์๊ณ ๋ฆฌ์ฆ์ ์์ ๊ฐ์ ์ด ์์ด๋ ์ต์ ์ ํด๋ฅผ ์ฐพ์ ์ ์๊ณ ,
๋์ ๋ชจ๋ ๊ฐ์ ์ ์ ๋ถ ํ์ธํ๋ฉด์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฐ๋ค.
https://www.youtube.com/watch?v=Ppimbaxm8d8 [๋๋น๋ ์ ํ๋ธ]
import sys
input = sys.stdin.readline
INF = int(1e9)
def bf(start):
# ์์ ๋
ธ๋์ ๋ํด์ ์ด๊ธฐํ
dist[start] = 0
# ์ ์ฒด n๋ฒ์ ๋ผ์ด๋๋ฅผ ๋ฐ๋ณต
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)
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])
'๐ค > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 1976: ์ฌํ ๊ฐ์ (Python) (0) | 2022.07.28 |
---|---|
๋ฐฑ์ค 1717: ์งํฉ์ ํํ (Python) (0) | 2022.07.28 |
๋ฐฑ์ค 1504: ํน์ ํ ์ต๋จ ๊ฒฝ๋ก (Python) (0) | 2022.07.12 |
๋ฐฑ์ค 1753: ์ต๋จ๊ฒฝ๋ก (Python) (0) | 2022.07.12 |
๋ฐฑ์ค 12865: ํ๋ฒํ ๋ฐฐ๋ญ (Python) (0) | 2022.04.11 |