[Python] λ°±μ€ 18352 νΉμ 거리μ λμ μ°ΎκΈ° (Dijkstra)


π λ¬Έμ
μ΄λ€ λλΌμλ 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λ‘λ ν μ μλ λ¬Έμ μ§λ§ λ€μ΅μ€νΈλΌλ₯Ό λ°°μ΄ κΉμ λ€μ΅μ€νΈλΌλ‘ νμ΄λ³΄μμ΅λλ€.