๐Ÿค–/๋ฐฑ์ค€

๋ฐฑ์ค€ 11657: ํƒ€์ž„๋จธ์‹  (Python)

sssbin 2022. 7. 18. 13:51

 

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])