본문 바로가기
Problem Solving/BOJ

[BOJ][Python]18352 풀이

by NoiB 2023. 7. 31.
반응형

https://www.acmicpc.net/problem/18352

 

18352번: 특정 거리의 도시 찾기

첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개

www.acmicpc.net

import heapq
import sys
ssr = sys.stdin.readline

INF = 300001

def dijkstra():
    while h:
        cur_dist, cur_node = heapq.heappop(h)
        if cur_dist > dist[cur_node]:
            continue
        for next_dist, next_node in routes[cur_node]:
            if dist[cur_node]+next_dist < dist[next_node]:
                dist[next_node] = dist[cur_node] + next_dist
                heapq.heappush(h, (dist[next_node], next_node))
        
n, m, k, x = map(int, ssr().split())
routes = [[] for _ in range(n+1)]
for _ in range(m):
    departure, arrival = map(int, ssr().split())
    routes[departure].append((1, arrival))
dist = [INF for _ in range(n+1)]
h = [(0, x)]
dist[x] = 0
dijkstra()
ans = []
for i in range(1, n+1):
    if dist[i] == k:
        ans.append(i)
if len(ans) != 0:
    print(*ans, end='\n')
else:
    print(-1)

 

모든 거리가 다 1로 주어지기 때문에 데이크스트라를 쓰지 않아도 풀 수 있습니다. 저는 그냥 연습하려고 데이크스트라로 풀어봤어요. 요 며칠 계속 유니온파인드만 풀어서 코드가 뚝딱 나오진 않고 조금 헤맸네요. 따로 거리가 주어지지 않아서 저장할 때 거리를 포함시켜서 저장했는데 생각해보면 굳이 그럴필요없이 배열을 갱신해야할 때 그냥 1만 더해주면 되겠어요.

 

데이크스트라 알고리즘에 대해 정리한 글을 업로드했습니다. 데이크스트라를 좀 더 알고 싶은 분들은 보시면 도움이 될 거라고 생각해요.

https://justduke.tistory.com/356

 

[Algorithm][Python]데이크스트라(Dijkstra) 최단 경로 알고리즘 + 코드

저를 가장 오랫동안 괴롭혔던 알고리즘 중에 하나인 데이크스트라 알고리즘에 대해서 정리를 해볼까합니다. 그 때의 헤매던 저와 비슷한 분들께 도움이 되면 좋겠네요. 데이크스트라(Dijkstra) 최

justduke.tistory.com

 

반응형

'Problem Solving > BOJ' 카테고리의 다른 글

[BOJ][Python]1504 풀이  (0) 2023.08.01
[BOJ][Python]1753 풀이  (0) 2023.08.01
[BOJ][Python]1967 풀이  (0) 2023.07.30
[BOJ][Python]1167 풀이  (0) 2023.07.30