반응형

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

+ Recent posts