반응형
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
해결 방법 : 다익스트라
- X를 출발점으로 모든 노드 최단거리 계산
- 사실 모든 노드 사이의 거리가 1이기 때문에 bfs로도 간단하게 풀릴 것 같은데 오랫만에 다익스트라 복습겸 사용해봤다.
- 우선순위큐를 사용하기 때문에 cur_fee가 K보다 커지면 탐색 종료.
import sys
input = sys.stdin.readline
import heapq
from collections import defaultdict
def solution(N, M, K, X, loads):
graph = defaultdict(list)
fee = [float('inf')] * (N+1)
fee[X] = 0
for f, t in loads:
graph[f].append(t)
Q = [(fee[X], X)]
while Q:
cur_fee, cur_n = heapq.heappop(Q)
if cur_fee > K: break
if fee[cur_n] < cur_fee: continue
for next_n in graph[cur_n]:
if cur_fee + 1 < fee[next_n]:
fee[next_n] = cur_fee + 1
heapq.heappush(Q, (cur_fee + 1, next_n))
answer = [str(i) for i in range(N+1) if fee[i] == K]
return '\n'.join(answer) if len(answer) > 0 else -1
if __name__ == '__main__':
N, M, K, X = map(int, input().split())
loads = [tuple(map(int, input().split())) for i in range(M)]
result = solution(N, M, K, X, loads)
print(result)반응형
'IT study > 알고리즘 문제 풀이' 카테고리의 다른 글
| 프로그래머스 : 배달 (0) | 2021.06.21 |
|---|---|
| 백준 2800 : 괄호 제거 (0) | 2021.06.19 |
| 백준 3079 : 입국심사 (0) | 2021.06.18 |
| 백준 1789 : 수들의 합 (0) | 2021.06.18 |
| 백준 21608 : 상어 초등학교 (0) | 2021.06.13 |