알고리즘/백준

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

hayoon2 2024. 2. 10. 03:42
반응형
SMALL

import heapq

N, M, K, X = map(int, input().split())
graph = [[] for _ in range(N + 1)]
INF = 1e8
distance = [INF] * (N + 1)

for i in range(M):
    A, B = map(int, input().split())
    graph[A].append((B, 1))


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

    while q:
        dist, now = heapq.heappop(q)

        if distance[now] < dist:
            continue

        for i in graph[now]:
            if dist + i[1] < distance[i[0]]:
                distance[i[0]] = dist + i[1]
                heapq.heappush(q, (dist + i[1], i[0]))


dijkstra(graph, X)
c=0
m=-1
for i in distance:
    c=c+1
    if i==K:
        m=0
        print(c-1)

if m==-1:
    print(-1)

 

🔍 문제 설명

N개의 도시와 M개의 도로가 존재하는 방향 그래프에서 출발 도시 X에서 출발해 거리 K인 도시를 찾는 문제입니다. 모든 도로의 거리는 1로 동일합니다.


🧠 접근 방법

  • 다익스트라 알고리즘으로 X에서 모든 도시까지의 최단 거리 계산.
  • 거리 배열을 확인해 거리 K인 도시를 필터링.
  • 가중치가 모두 1이므로 BFS도 가능하지만, 다익스트라로 풀이.

📝 코드 설명

  • INF를 크게 설정해 초기 거리 배열을 무한대로 초기화.
  • graph[A].append((B, 1))로 (도착지, 비용) 형태로 저장.
  • 다익스트라로 모든 도시까지의 최단 거리 계산 후, 거리 K만 필터링하여 출력.
  • found 변수로 거리 K 도시가 없는 경우 -1 출력.

📊 플로우차트

단계 플로우 주요 코드 변수 상태 (입력값: 4 4 2 1 / 간선: 1→2, 1→3, 2→3, 2→4)
1 문제 입력 및 초기화 N, M, K, X 입력, graph 초기화 N=4, M=4, K=2, X=1
graph=[[], [], [], [], []]
2 그래프 구성 graph[A].append((B, 1)) graph=[[], [(2,1), (3,1)], [(3,1), (4,1)], [], []]
3 distance 배열 무한대로 초기화 distance = [INF] * (N+1) distance = [INF, INF, INF, INF, INF]
4 시작 노드 X를 큐에 삽입 heapq.heappush(q, (0, X)) q = [(0,1)]
distance[1]=0
5 큐에서 노드 꺼내기 dist, now = heapq.heappop(q) now=1, dist=0
q=[]
6 인접 노드 탐색 for i in graph[now]: i = (2,1), (3,1)
7 거리 갱신 및 큐 삽입 distance[i[0]] = dist + i[1]
heapq.heappush(q)
distance=[INF, 0, 1, 1, INF]
q=[(1,2), (1,3)]
8 다음 pop 및 인접 노드 탐색 pop(1,2) 후 graph[2] 탐색 i = (3,1), (4,1)
distance[4] = 2
9 최종 거리 배열 완성 큐 반복 종료 distance=[INF, 0, 1, 1, 2]
10 거리 K 노드 필터링 if distance[i] == 2 출력값: 4
반응형
LIST