카테고리 없음

BFS 알고리즘 (백준 2021번: 최소 환승 경로)

virbr0.net 2024. 8. 2. 22:22

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

 

파이썬으로 아래와 같이 구현하였다.

 

import sys
from collections import deque

input = sys.stdin.readline

n, l = map(int, input().split())
station_visited = [0] * (n + 1) # 각 역의 깊이 저장 (환승 횟수)
line_visited = [0] * (l + 1) # 해당 노선을 이용한 적 있나?
subway = [list(map(int, input().split())) for _ in range(l)]
graph = [[] for _ in range(n + 1)]

for i in range(l):
    for j in subway[i]:
        if j == -1:
            break
        graph[j].append(i)

start, end = map(int, input().split())

q = deque()

# 큐에 시작 역 추가 후 방문 처리
q.append(start)
station_visited[start] = 1
flag = 0
while q:
    cur = q.popleft()

    # 목적지 까지 도착했다면
    if cur == end:
        if start == end:
            # 시작과 끝이 같은 경우 환승 없음
            print(0)
        else:
            print(station_visited[cur] - 2)
        flag = 1
        break

    for i in graph[cur]:
        # 해당 역에 도착하는 노선들
        if line_visited[i]:
            # 노선 중 이미 방문한 노선이 있다면 패스
            continue

        # 노선을 방문 처리
        line_visited[i] = 1

        for j in subway[i]:
            # 해당 노선이 운행하는 역들 목록을 가져와
            if station_visited[j] or j == -1:
                # 이미 방문한 적이 있으면 패스
                continue

            # 역 방문한 적이 없다면 현재 방문한 라인 에서 1단계 깊은 곳이므로 추가
            # 단 시작점은 0 단계, 시작점과 같은 라인은 1단계...따라서 최종 결과에서 -2 함
            # 시작점이 환승 역인 경우, 이미 방문한 노선은 line_visited 에서 처리 되므로 중복 처리 안됨
            station_visited[j] = station_visited[cur] + 1
            q.append(j)

if not flag:
    # 목적지에 도달할 수 없다면 -1 출력
    print(-1)