πŸ’» Algorithm/Python

[Python] λ°±μ€€ 18352 νŠΉμ • 거리의 λ„μ‹œ μ°ΎκΈ° (Dijkstra)

μ„ μ£Ό 2022. 7. 8. 23:40

πŸ“Œ 문제

μ–΄λ–€ λ‚˜λΌμ—λŠ” 1λ²ˆλΆ€ν„° Nλ²ˆκΉŒμ§€μ˜ λ„μ‹œμ™€ M개의 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€. λͺ¨λ“  λ„λ‘œμ˜ κ±°λ¦¬λŠ” 1이닀.

 

이 λ•Œ νŠΉμ •ν•œ λ„μ‹œ Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λͺ¨λ“  λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 μ •ν™•νžˆ K인 λͺ¨λ“  λ„μ‹œλ“€μ˜ 번호λ₯Ό 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. λ˜ν•œ 좜발 λ„μ‹œ Xμ—μ„œ 좜발 λ„μ‹œ X둜 κ°€λŠ” μ΅œλ‹¨ κ±°λ¦¬λŠ” 항상 0이라고 κ°€μ •ν•œλ‹€.

예λ₯Ό λ“€μ–΄ N=4, K=2, X=1일 λ•Œ λ‹€μŒκ³Ό 같이 κ·Έλž˜ν”„κ°€ κ΅¬μ„±λ˜μ–΄ μžˆλ‹€κ³  κ°€μ •ν•˜μž.

 

이 λ•Œ 1번 λ„μ‹œμ—μ„œ μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 2인 λ„μ‹œλŠ” 4번 λ„μ‹œ 뿐이닀. 2번과 3번 λ„μ‹œμ˜ 경우, μ΅œλ‹¨ 거리가 1이기 λ•Œλ¬Έμ— 좜λ ₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

μž…λ ₯

첫째 쀄에 λ„μ‹œμ˜ 개수 N, λ„λ‘œμ˜ 개수 M, 거리 정보 K, 좜발 λ„μ‹œμ˜ 번호 Xκ°€ μ£Όμ–΄μ§„λ‹€. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) λ‘˜μ§Έ 쀄뢀터 M개의 쀄에 κ±Έμ³μ„œ 두 개의 μžμ—°μˆ˜ A, Bκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ μ£Όμ–΄μ§„λ‹€. μ΄λŠ” A번 λ„μ‹œμ—μ„œ B번 λ„μ‹œλ‘œ μ΄λ™ν•˜λŠ” 단방ν–₯ λ„λ‘œκ°€ μ‘΄μž¬ν•œλ‹€λŠ” μ˜λ―Έλ‹€. (1 ≤ A, B ≤ N) 단, A와 BλŠ” μ„œλ‘œ λ‹€λ₯Έ μžμ—°μˆ˜μ΄λ‹€.

좜λ ₯

Xλ‘œλΆ€ν„° μΆœλ°œν•˜μ—¬ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λͺ¨λ“  λ„μ‹œμ˜ 번호λ₯Ό ν•œ 쀄에 ν•˜λ‚˜μ”© μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 좜λ ₯ν•œλ‹€.

 

이 λ•Œ 도달할 수 μžˆλŠ” λ„μ‹œ μ€‘μ—μ„œ, μ΅œλ‹¨ 거리가 K인 λ„μ‹œκ°€ ν•˜λ‚˜λ„ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ -1을 좜λ ₯ν•œλ‹€.

예제 μž…λ ₯ 1

4 4 2 1
1 2
1 3
2 3
2 4

예제 좜λ ₯ 1

4

예제 μž…λ ₯ 2

4 3 2 1
1 2
1 3
1 4

예제 좜λ ₯ 2

-1

예제 μž…λ ₯ 3

4 4 1 1
1 2
1 3
2 3
2 4

예제 좜λ ₯ 3

2
3

 


πŸ“Œ 풀이

πŸ’¬ Code

import sys, heapq
input = sys.stdin.readline
INF = float('inf')


def dijkstra(start):
    q = []
    heapq.heappush(q, (0, start))
    distance[start] = 0

    while q:
        dist, now = heapq.heappop(q)
        if dist > distance[now]:
            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]))


n, m, k, start = map(int, input().split())
graph = [[] for _ in range(n+1)]
distance = [INF] * (n+1)

for _ in range(m):
    a, b = map(int, input().split())
    graph[a].append((b, 1))

dijkstra(start)

isNone = 1
for i in range(1, n+1):
    if distance[i] == k:
        isNone = 0
        print(i)

if isNone:
    print(-1)

πŸ’‘ Solution

BFSλ‘œλ„ ν’€ 수 μžˆλŠ” λ¬Έμ œμ§€λ§Œ λ‹€μ΅μŠ€νŠΈλΌλ₯Ό 배운 김에 λ‹€μ΅μŠ€νŠΈλΌλ‘œ ν’€μ–΄λ³΄μ•˜μŠ΅λ‹ˆλ‹€.