๐Ÿค–/์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ •๋ฆฌ

์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Shortest Path Algorithm)

sssbin 2022. 4. 14. 17:44

 

๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ๋„๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•

- 'ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ํŠน์ • ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ'

- '๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ'

- ์ตœ๋‹จ ๊ฒฝ๋กœ ๋ฌธ์ œ๋Š” ๋ณดํ†ต ๊ทธ๋ž˜ํ”„๋ฅผ ์ด์šฉํ•ด ํ‘œํ˜„

    ใ„ด ๊ฐ ์ง€์ ์€ ๊ทธ๋ž˜ํ”„์—์„œ '๋…ธ๋“œ'๋กœ ํ‘œํ˜„๋˜๊ณ ,

    ใ„ด ์ง€์  ๊ฐ„ ์—ฐ๊ฒฐ๋œ ๋„๋กœ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ '๊ฐ„์„ '์œผ๋กœ ํ‘œํ˜„๋œ๋‹ค.

 

๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ๊ทธ๋ž˜ํ”„์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ํŠน์ •ํ•œ ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

- '์Œ์˜ ๊ฐ„์„ '์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘

- ๋งค๋ฒˆ '๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ'๋ฅผ ์„ ํƒํ•ด์„œ ์ž„์˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜

- ์•Œ๊ณ ๋ฆฌ์ฆ˜

    1) ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ •

    2) ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ์ดˆ๊ธฐํ™”

    3) ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ ์„ ํƒ

    4) ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ” ๊ฐฑ์‹ 

    5) ์œ„ ๊ณผ์ •์—์„œ 3๋ฒˆ๊ณผ 4๋ฒˆ์„ ๋ฐ˜๋ณต

๋ฐฉ๋ฒ•1) ๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ์ง€๋งŒ ๋А๋ฆฌ๊ฒŒ ๋™์ž‘)

- ์ฒ˜์Œ์— ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๋‹ด๋Š” 1์ฐจ์› ๋ฆฌ์ŠคํŠธ ์„ ์–ธ

- ๋‹จ๊ณ„๋งˆ๋‹ค '๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒ'ํ•˜๊ธฐ ์œ„ํ•ด

   ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค 1์ฐจ์› ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ™•์ธ(์ˆœ์ฐจํƒ์ƒ‰)

- ์‹œ๊ฐ„๋ณต์žก๋„ O(V^2) (V๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜)

# ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜
# ๊ฐ„๋‹จํ•œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ

import sys
input = sys.stdin.readline # ๋ฐ์ดํ„ฐ์˜ ์ˆ˜๊ฐ€ ๋งŽ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์‚ฌ์šฉ
INF = int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n+1)]
# ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
visited = [False] * (n+1)
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n+1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c
    graph[a].append((b, c))

# ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ ๋ฐ˜ํ™˜
def get_smallest_node():
    min_value = INF
    index = 0 # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
    for i in range(1, n+1):
        if distance[i] < min_value and not visited[i]:
            min_value = distance[i]
            index = i
    return index

def dijkstra(start):
    # ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
    distance[start] = 0
    visited[start] = True
    for j in graph[start]:
        distance[j[0]] = j[1]
    # ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n-1๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋ฐ˜๋ณต
    for i in range(n-1):
        # ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
        now = get_smallest_node()
        visited[now] = True
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
        for j in graph[now]:
            cost = distance[now] + j[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[j[0]]:
                distance[j[0]] = cost

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
for i in range(1, n+1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    else:
        print(distance[i])

๋ฐฉ๋ฒ•2) ๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ ๋น ๋ฅด๊ฒŒ ๋™์ž‘)

- ํž™ ์ž๋ฃŒ๊ตฌ์กฐ ์‚ฌ์šฉ -> ํŠน์ • ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํž™์— ๋‹ด์•„์„œ ์ฒ˜๋ฆฌ

    ใ„ด ํž™: ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ - ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์žฅ ๋จผ์ € ์‚ญ์ œ

    ใ„ด ํŒŒ์ด์ฌ์—์„œ PriorityQueue, heapq ์‚ฌ์šฉ ๊ฐ€๋Šฅ (์ผ๋ฐ˜์ ์œผ๋กœ heapq๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘)

    ใ„ด ์šฐ์„ ์ˆœ์œ„ ํ ๊ตฌํ˜„๋ฐฉ์‹ - ๋ฆฌ์ŠคํŠธ, ํž™

    ใ„ด ๋ฆฌ์ŠคํŠธ ์‚ฝ์ž…์‹œ๊ฐ„ O(1), ์‚ญ์ œ์‹œ๊ฐ„ O(N)

    ใ„ด ํž™ ์‚ฝ์ž…์‹œ๊ฐ„ O(logN), ์‚ญ์ œ์‹œ๊ฐ„ O(logN)

    ใ„ด ํ˜„์žฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์œผ๋กœ๋งŒ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ถ”๊ฐ€๋กœ ์ด์šฉ

- ์‹œ๊ฐ„๋ณต์žก๋„ O(ElogV) (V๋Š” ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, E๋Š” ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜)

- ์•ž์˜ ์ฝ”๋“œ์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ, get_smallest_node()๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ํŠน์ง•์ด ์žˆ๋‹ค.

- '์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ'๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์„ ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ํ•จ์ˆ˜ ์•ˆ์—์„œ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

# ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜
# ๊ฐœ์„ ๋œ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ฝ”๋“œ

import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜ ์ž…๋ ฅ๋ฐ›๊ธฐ
n, m = map(int, input().split())
# ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
start = int(input())
# ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
graph = [[] for i in range(n+1)]
# ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
distance = [INF] * (n+1)

# ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
for _ in range(m):
    a, b, c = map(int, input().split())
    # a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c
    graph[a].append((b, c))

def dijkstra(start):
    q = []
    # ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ํ์— ์‚ฝ์ž…
    heapq.heappush(q, (0, start))
    distance[start] = 0
    while q: # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
        if distance[now] < dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
dijkstra(start)

# ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ถœ๋ ฅ
for i in range(1, n+1):
    # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ์ด๋ผ๊ณ  ์ถœ๋ ฅ
    if distance[i] == INF:
        print("INFINITY")
    # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฑฐ๋ฆฌ ์ถœ๋ ฅ
    else:
        print(distance[i])

 

ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ๋ชจ๋“  ์ง€์ ์—์„œ ๋‹ค๋ฅธ ๋ชจ๋“  ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋ชจ๋‘ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

- ๋‹จ๊ณ„๋งˆ๋‹ค '๊ฑฐ์ณ ๊ฐ€๋Š” ๋…ธ๋“œ'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ํ•˜์ง€๋งŒ ๋งค๋ฒˆ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์„ ํ•„์š”๊ฐ€ ์—†๋‹ค.

- ์‹œ๊ฐ„๋ณต์žก๋„ O(N^3)

    ใ„ด ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๊ฐ€ N๊ฐœ ์ผ ๋•Œ, N๋ฒˆ์˜ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ O(N)

    ใ„ด ๋ชจ๋“  ๋…ธ๋“œ์— ๋Œ€ํ•˜์—ฌ ๋‹ค๋ฅธ ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ๋‹ด๊ธฐ ์œ„ํ•ด 2์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฒ˜๋ฆฌ O(N^2)

# ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜
# ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ์ฝ”๋ฆฌ์ฆ˜ ์ฝ”๋“œ

INF = int(1e9)

# ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ ๋ฐ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
n = int(input())
m = int(input())
# 2์ฐจ์› ๋ฆฌ์ŠคํŠธ(๊ทธ๋ž˜ํ”„ ํ‘œํ˜„)๋ฅผ ๋งŒ๋“ค๊ณ , ๋ชจ๋“  ๊ฐ’์„ ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”
graph = [[INF] * (n+1) for _ in range(n+1)]

# ์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for a in range(1, n+1):
    for b in range(1, n+1):
        if a == b:
            graph[a][b] = 0

# ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„ ๊ทธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”
for _ in range(m):
    # a์—์„œ b๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ c๋กœ ์„ค์ •
    a, b, c = map(int, input().split())
    graph[a][b] = c

# ์ ํ™”์‹์— ๋”ฐ๋ผ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
for k in range(1, n+1):
    for a in range(1, n+1):
        for b in range(1, n+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

# ์ˆ˜ํ–‰๋œ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅ
for a in range(1, n+1):
    for b in range(1, n+1):
        # ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ์ด๋ผ๊ณ  ์ถœ๋ ฅ
        if graph[a][b] == INF:
            print("INFINITY", end=" ")
        # ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ, ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
        else:
            print(graph[a][b], end=" ")
    print()

 

์‹ค์ „ ๋ฌธ์ œ1. ๋ฏธ๋ž˜ ๋„์‹œ

- ๋ฐฉ๋ฌธ ํŒ๋งค์›์ด 1๋ฒˆ ํšŒ์‚ฌ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ K๋ฒˆ ํšŒ์‚ฌ๋ฅผ ๋ฐฉ๋ฌธํ•œ ๋’ค์— X๋ฒˆ ํšŒ์‚ฌ๋กœ ๊ฐ€๋Š” ์ตœ์†Œ ์‹œ๊ฐ„ ๊ตฌํ•˜๊ธฐ

   ์—ฐ๊ฒฐ๋œ 2๊ฐœ์˜ ํšŒ์‚ฌ๋Š” ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ๊ฐ€๋Šฅ

- ์ด ๋ฌธ์ œ๋Š” ์ „ํ˜•์ ์ธ ํ”Œ๋กœ์ด๋“œ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ์ด๋‹ค.

- 1๋ฒˆ ๋…ธ๋“œ~X~K๋กœ ๊ฐ€๋Š” ์ตœ๋‹จ ๊ฑฐ๋ฆฌ = (1๋ฒˆ ๋…ธ๋“œ~X ์ตœ๋‹จ๊ฑฐ๋ฆฌ) + (X~K ์ตœ๋‹จ๊ฑฐ๋ฆฌ)

# ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜
# ์‹ค์ „ ๋ฌธ์ œ1. ๋ฏธ๋ž˜ ๋„์‹œ

INF = int(1e9) # ๋ฌดํ•œ

n, m = map(int, input().split())
graph = [[INF] * (n+1) for _ in range(n+1)] # 2์ฐจ์› ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ณ  ๋ฌดํ•œ์œผ๋กœ ์ดˆ๊ธฐํ™”

# ์ž๊ธฐ ์ž์‹ ์—์„œ ์ž๊ธฐ ์ž์‹ ์œผ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์€ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
for a in range(1, n+1):
    for b in range(1, n+1):
        if a == b:
            graph[a][b] = 0

# ๊ฐ ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ณ , ์„œ๋กœ์—๊ฒŒ ๊ฐ€๋Š” ๋น„์šฉ์„ 1๋กœ ์„ค์ •
for _ in range(m):
    a, b = map(int, input().split())
    graph[a][b] = 1
    graph[b][a] = 1

x, k = map(int, input().split())

# ํ”Œ๋กœ์ด์ฆ˜ ์›Œ์…œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
for k in range(1, n+1):
    for a in range(1, n+1):
        for b in range(1, n+1):
            graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b])

dist = graph[1][k] + graph[k][x]

if dist >= INF:
    print("-1")
else:
    print(dist)

 

 

์‹ค์ „ ๋ฌธ์ œ2. ์ „๋ณด

- X์—์„œ Y๋กœ์˜ ํ†ต๋กœ๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฉ”์‹œ์ง€ ์ „์†ก ๊ฐ€๋Šฅ

- ๋ฉ”์‹œ์ง€ ๋ณด๋‚ผ ๋•Œ๋Š” ์ผ์ • ์‹œ๊ฐ„ ์†Œ์š”๋จ

- ๋ฉ”์‹œ์ง€๋Š” ๋„์‹œ C์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๊ฐ ๋„์‹œ ์‚ฌ์ด์— ์„ค์น˜๋œ ํ†ต๋กœ๋ฅผ ๊ฑฐ์ณ ์ตœ๋Œ€ํ•œ ๋งŽ์ด ํผ์ ธ๋‚˜๊ฐˆ ๊ฒƒ์ด๋‹ค.

- C์—์„œ ๋ณด๋‚ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ฒŒ ๋˜๋Š” ๋„์‹œ์˜ ์ด ๊ฐœ์ˆ˜์™€ ๋„์‹œ๋“ค์ด ๋ชจ๋‘ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๋Š” ๋ฐ๊นŒ์ง€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„ ๊ณ„์‚ฐ

- ์ž…๋ ฅ) ์ฒซ์งธ ์ค„์— ๋„์‹œ์˜ ๊ฐœ์ˆ˜ N, ํ†ต๋กœ์˜ ๊ฐœ์ˆ˜ M, ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ ์ž ํ•˜๋Š” ๋„์‹œ C

            ๋‘˜์งธ ~ M+1 ์ค„์— ํ†ต๋กœ์— ๋Œ€ํ•œ ์ •๋ณด X, Y, Z (X->Y ์‹œ๊ฐ„ C)

- ์ถœ๋ ฅ) ๋„์‹œ์˜ ์ด ๊ฐœ์ˆ˜์™€ ์ด ์‹œ๊ฐ„ 

# ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜
# ์‹ค์ „ ๋ฌธ์ œ2. ์ „๋ณด

import heapq
import sys
input = sys.stdin.readline
INF = int(1e9)

n, m, c = map(int, input().split())

graph = [[] for i in range(n+1)]
distance = [INF] * (n+1)

for _ in range(m):
    x, y, z = map(int, input().split())
    graph[x].append((y, z))

def dijkstra(c):
    q = []
    # ์‹œ์ž‘ ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋Š” 0์œผ๋กœ ์„ค์ •ํ•˜์—ฌ ํ์— ์‚ฝ์ž…
    heapq.heappush(q, (0, c))
    distance[c] = 0
    while q: # ํ๊ฐ€ ๋น„์–ด์žˆ์ง€ ์•Š๋‹ค๋ฉด
        # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด ๊บผ๋‚ด๊ธฐ
        dist, now = heapq.heappop(q)
        # ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ ์ด๋ฏธ ์ฒ˜๋ฆฌ๋œ ์ ์ด ์žˆ๋Š” ๋…ธ๋“œ๋ผ๋ฉด ๋ฌด์‹œ
        if distance[now] < dist:
            continue
        # ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ์ธ์ ‘ํ•œ ๋…ธ๋“œ๋“ค์„ ํ™•์ธ
        for i in graph[now]:
            cost = dist + i[1]
            # ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ, ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
            if cost < distance[i[0]]:
                distance[i[0]] = cost
                heapq.heappush(q, (cost, i[0]))

# ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜ํ–‰
dijkstra(c)

count = 0
max_dist = 0

for d in distance:
    if d != INF:
        count += 1
        max_dist = max(max_dist, d)

print(count-1, max_dist)