[이취코-μ΅œλ‹¨κ²½λ‘œ] 전보 / Python

πŸ“š Problem Solving/이취코

문제

μ–΄λ–€ λ‚˜λΌμ—λŠ” N개의 λ„μ‹œκ°€ μžˆλ‹€. 그리고 각 λ„μ‹œλŠ” λ³΄λ‚΄κ³ μž ν•˜λŠ” λ©”μ‹œμ§€κ°€ μžˆλŠ” 경우, λ‹€λ₯Έ λ„μ‹œλ‘œ 전보λ₯Ό λ³΄λ‚΄μ„œ λ‹€λ₯Έ λ„μ‹œλ‘œ ν•΄λ‹Ή λ©”μ‹œμ§€λ₯Ό 전솑할 수 μžˆλ‹€. ν•˜μ§€λ§Œ XλΌλŠ” λ„μ‹œμ—μ„œ YλΌλŠ” λ„μ‹œλ‘œ 전보λ₯Ό λ³΄λ‚΄κ³ μž ν•œλ‹€λ©΄, λ„μ‹œ Xμ—μ„œ Y둜 ν–₯ν•˜λŠ” ν†΅λ‘œκ°€ μ„€μΉ˜λ˜μ–΄ μžˆμ–΄μ•Ό ν•œλ‹€. 예λ₯Ό λ“€μ–΄ Xμ—μ„œ Y둜 ν–₯ν•˜λŠ” ν†΅λ‘œλŠ” μžˆμ§€λ§Œ, Yμ—μ„œ X둜 ν–₯ν•˜λŠ” ν†΅λ‘œκ°€ μ—†λ‹€λ©΄ YλŠ” X둜 λ©”μ‹œμ§€λ₯Ό 보낼 수 μ—†λ‹€. λ˜ν•œ ν†΅λ‘œλ₯Ό 거쳐 λ©”μ‹œμ§€λ₯Ό 보낼 λ•ŒλŠ” 일정 μ‹œκ°„μ΄ μ†Œμš”λœλ‹€.

μ–΄λŠ λ‚  CλΌλŠ” λ„μ‹œμ—μ„œ μœ„κΈ‰ 상황이 λ°œμƒν–ˆλ‹€. κ·Έλž˜μ„œ μ΅œλŒ€ν•œ λ§Žμ€ λ„μ‹œλ‘œ λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ³ μž ν•œλ‹€. λ©”μ‹œμ§€λŠ” λ„μ‹œ Cμ—μ„œ μΆœλ°œν•˜μ—¬ 각 λ„μ‹œ 사이에 μ„€μΉ˜λœ ν†΅λ‘œλ₯Ό 거쳐, μ΅œλŒ€ν•œ 많이 νΌμ Έλ‚˜κ°ˆ 것이닀. 각 λ„μ‹œμ˜ λ²ˆν˜Έμ™€ ν†΅λ‘œκ°€ μ„€μΉ˜λ˜μ–΄ μžˆλŠ” 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, λ„μ‹œ Cμ—μ„œ 보낸 λ©”μ‹œμ§€λ₯Ό λ°›κ²Œ λ˜λŠ” λ„μ‹œμ˜ κ°œμˆ˜λŠ” 총 λͺ‡ 개이며 λ„μ‹œλ“€μ΄ λͺ¨λ‘ λ©”μ‹œμ§€λ₯Ό λ°›λŠ” λ°κΉŒμ§€ κ±Έλ¦¬λŠ” μ‹œκ°„μ€ μ–Όλ§ˆμΈμ§€ κ³„μ‚°ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯쑰건

1. 첫째 쀄에 λ„μ‹œμ˜ 개수 N, ν†΅λ‘œμ˜ 개수 M, λ©”μ‹œμ§€λ₯Ό λ³΄λ‚΄κ³ μž ν•˜λŠ” λ„μ‹œ Cκ°€ 주어진닀.

(1 <= N <= 30,000, 1 <= M <= 200,000, 1 <= C <= N)

 

2. λ‘˜μ§Έ 쀄뢀터 M+1번째 쀄에 κ±Έμ³μ„œ ν†΅λ‘œμ— λŒ€ν•œ 정보 X, Y, Zκ°€ 주어진닀. μ΄λŠ” νŠΉμ • λ„μ‹œ Xμ—μ„œ λ‹€λ₯Έ νŠΉμ • λ„μ‹œ Y둜 μ΄μ–΄μ§€λŠ” ν†΅λ‘œκ°€ 있으며, λ©”μ‹œμ§€κ°€ μ „λ‹¬λ˜λŠ” μ‹œκ°„μ΄ ZλΌλŠ” μ˜λ―Έλ‹€.

(1 <= X, Y <= N, 1 <= Z <= 1,000)

 

좜λ ₯쑰건

첫째 쀄에 λ„μ‹œ Cμ—μ„œ 보낸 λ©”μ‹œμ§€λ₯Ό λ°›λŠ” λ„μ‹œμ˜ 총 κ°œμˆ˜μ™€ 총 κ±Έλ¦¬λŠ” μ‹œκ°„μ„ 곡백으둜 κ΅¬λΆ„ν•˜μ—¬ 좜λ ₯ν•œλ‹€.

 

import sys
import heapq

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

n, m, start = map(int, input().split())
graph = [[] for _ 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(start):
    q = []
    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)

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

print(count, max_distance)