[λ°±μ€€] νŒŒν‹° / 1238번 / Python / 파이썬 / λ‹€μ΅μŠ€νŠΈλΌ(Dijkstra) μ•Œκ³ λ¦¬μ¦˜
Algorithm/Baekjoon

[λ°±μ€€] νŒŒν‹° / 1238번 / Python / 파이썬 / λ‹€μ΅μŠ€νŠΈλΌ(Dijkstra) μ•Œκ³ λ¦¬μ¦˜

728x90
λ°˜μ‘ν˜•

πŸ’‘solutions 

πŸ’¬ heap μ΅œμ†Œνž™ 자료ꡬ쑰λ₯Ό ν™œμš©ν•˜μ—¬ λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μœΌλ‘œ ν•΄κ²°ν•˜μ˜€λ‹€.

πŸ’¬ λ¨Όμ € Nλͺ…μ˜ ν•™μƒλ“€λ§ˆλ‹€ X번 λ§ˆμ„μ— μ™•λ³΅μœΌλ‘œ λ‹€λ…€μ˜€λŠ”λ° κ±Έλ¦¬λŠ” μ΅œμ†Œ μ‹œκ°„μ„ κ΅¬ν•œλ‹€. -> μ΄λ•Œ νŽΈλ„κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μ΅œμ†Œ μ‹œκ°„μ€ dijkstra(i, x) + dijkstra(x, i)으둜 β‘  i번 학생이 본인의 λ§ˆμ„μ—μ„œ X번 λ§ˆμ„λ‘œ κ°€λŠ” μ΅œμ†Œ μ‹œκ°„κ³Ό β‘‘ X번 λ§ˆμ„μ—μ„œ μΆœλ°œν•˜μ—¬ 본인 λ§ˆμ„λ‘œ λŒμ•„μ˜€λŠ” 데 κ±Έλ¦¬λŠ” μ΅œμ†Œ μ‹œκ°„μ„ λ”ν•˜λ©΄ λœλ‹€.

πŸ’¬ λ§ˆμ§€λ§‰μœΌλ‘œ 각 학생듀이 X번 λ§ˆμ„μ— λ‹€λ…€μ˜€λŠ”λ° κ±Έλ¦° μ΅œμ†Œ μ‹œκ°„μ„ λΉ„κ΅ν•˜μ—¬ κ°€μž₯ λ§Žμ€ μ‹œκ°„μ„ μ†ŒλΉ„ν•œ ν•™μƒμ˜ μ†Œμš”μ‹œκ°„μ„ 좜λ ₯ν•˜λ©΄ λœλ‹€.

πŸ‘¨‍πŸ’»code 

import heapq
import sys


def dijkstra(start, end):
    distance = [INF] * (n+1)
    hq = [(0, start)]
    distance[start] = 0
    while hq:
        dist, now = heapq.heappop(hq)
        if distance[now] < dist:
            continue
        for cost, node in adj[now]:
            if distance[node] > cost + dist:
                distance[node] = cost + dist
                heapq.heappush(hq, (cost + dist, node))
    return distance[end]



input = sys.stdin.readline
n, m, x = map(int, input().split())
adj = [[] for _ in range(n+1)]
INF = float('inf')
for _ in range(m):
    a, b, c = map(int, input().split())
    adj[a].append((c, b))

answer = 0
for i in range(1, n+1):
    result = dijkstra(i, x) + dijkstra(x, i)
    if answer < result:
        answer = result
print(answer)

 

πŸ“Œdescription 

 

μ½”λ”©ν…ŒμŠ€νŠΈ μ—°μŠ΅ - [3μ°¨] nμ§„μˆ˜ κ²Œμž„

Nμ§„μˆ˜ κ²Œμž„ νŠœλΈŒκ°€ ν™œλ™ν•˜λŠ” μ½”λ”© λ™μ•„λ¦¬μ—μ„œλŠ” μ „ν†΅μ μœΌλ‘œ ν•΄μ˜€λŠ” κ²Œμž„μ΄ μžˆλ‹€. 이 κ²Œμž„μ€ μ—¬λŸ¬ μ‚¬λžŒμ΄ λ‘₯κΈ€κ²Œ μ•‰μ•„μ„œ 숫자λ₯Ό ν•˜λ‚˜μ”© μ°¨λ‘€λŒ€λ‘œ λ§ν•˜λŠ” κ²Œμž„μΈλ°, κ·œμΉ™μ€ λ‹€μŒκ³Ό κ°™λ‹€. 숫자λ₯Ό 0

programmers.co.kr


문제

N개의 숫자둜 κ΅¬λΆ„λœ 각각의 λ§ˆμ„μ— ν•œ λͺ…μ˜ 학생이 μ‚΄κ³  μžˆλ‹€.

μ–΄λŠ λ‚  이 Nλͺ…μ˜ 학생이 X (1 ≤ X ≤ N)번 λ§ˆμ„μ— λͺ¨μ—¬μ„œ νŒŒν‹°λ₯Ό 벌이기둜 ν–ˆλ‹€. 이 λ§ˆμ„ μ‚¬μ΄μ—λŠ” 총 M개의 단방ν–₯ λ„λ‘œλ“€μ΄ 있고 i번째 길을 μ§€λ‚˜λŠ”λ° Ti(1 ≤ Ti ≤ 100)의 μ‹œκ°„μ„ μ†ŒλΉ„ν•œλ‹€.

각각의 학생듀은 νŒŒν‹°μ— μ°Έμ„ν•˜κΈ° μœ„ν•΄ κ±Έμ–΄κ°€μ„œ λ‹€μ‹œ κ·Έλ“€μ˜ λ§ˆμ„λ‘œ λŒμ•„μ™€μ•Ό ν•œλ‹€. ν•˜μ§€λ§Œ 이 학생듀은 μ›Œλ‚™ κ²Œμ„λŸ¬μ„œ μ΅œλ‹¨ μ‹œκ°„μ— 였고 κ°€κΈ°λ₯Ό μ›ν•œλ‹€.

이 λ„λ‘œλ“€μ€ 단방ν–₯이기 λ•Œλ¬Έμ— μ•„λ§ˆ 그듀이 였고 κ°€λŠ” 길이 λ‹€λ₯Όμ§€λ„ λͺ¨λ₯Έλ‹€. Nλͺ…μ˜ 학생듀 쀑 였고 κ°€λŠ”λ° κ°€μž₯ λ§Žμ€ μ‹œκ°„μ„ μ†ŒλΉ„ν•˜λŠ” 학생은 λˆ„κ΅¬μΌμ§€ κ΅¬ν•˜μ—¬λΌ.

μž…λ ₯

첫째 쀄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), Xκ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ μž…λ ₯λœλ‹€. 두 번째 쀄뢀터 M+1번째 μ€„κΉŒμ§€ i번째 λ„λ‘œμ˜ μ‹œμž‘μ , 끝점, 그리고 이 λ„λ‘œλ₯Ό μ§€λ‚˜λŠ”λ° ν•„μš”ν•œ μ†Œμš”μ‹œκ°„ Tiκ°€ λ“€μ–΄μ˜¨λ‹€. μ‹œμž‘μ κ³Ό 끝점이 같은 λ„λ‘œλŠ” μ—†μœΌλ©°, μ‹œμž‘μ κ³Ό ν•œ λ„μ‹œ Aμ—μ„œ λ‹€λ₯Έ λ„μ‹œ B둜 κ°€λŠ” λ„λ‘œμ˜ κ°œμˆ˜λŠ” μ΅œλŒ€ 1κ°œμ΄λ‹€.

λͺ¨λ“  학생듀은 μ§‘μ—μ„œ X에 갈수 있고, Xμ—μ„œ μ§‘μœΌλ‘œ λŒμ•„μ˜¬ 수 μžˆλŠ” λ°μ΄ν„°λ§Œ μž…λ ₯으둜 주어진닀.

좜λ ₯

첫 번째 쀄에 Nλͺ…μ˜ 학생듀 쀑 였고 κ°€λŠ”λ° κ°€μž₯ 였래 κ±Έλ¦¬λŠ” ν•™μƒμ˜ μ†Œμš”μ‹œκ°„μ„ 좜λ ₯ν•œλ‹€.




λ°˜μ‘ν˜•