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

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)

'프로그래밍' 카테고리의 다른 글

유니온 파인드 알고리즘 (백준 1717: 집합의 표현)  (0) 2024.02.03
다익스트라 알고리즘 (백준 1753번: 최단경로)  (0) 2024.01.23
공간이 연속 할 경우 합치기  (0) 2024.01.22
DFS/BFS 구현 시 큐에 넣기 전에 방문 처리 할 것  (0) 2024.01.10
파이썬3의 딕셔너리의 keys() 메서드 반환 값은 리스트가 아니야.  (0) 2024.01.08
'프로그래밍' 카테고리의 다른 글
  • 유니온 파인드 알고리즘 (백준 1717: 집합의 표현)
  • 다익스트라 알고리즘 (백준 1753번: 최단경로)
  • 공간이 연속 할 경우 합치기
  • DFS/BFS 구현 시 큐에 넣기 전에 방문 처리 할 것
virbr0.net
virbr0.net
  • virbr0.net
    virbr0.net
    virbr0.net
  • 전체
    오늘
    어제
    • 분류 전체보기
      • SIP
      • HTTP
      • OS
      • 프로그래밍
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    가상화
    RDP
    DFS
    chunked
    파이썬
    BFS
    RTP
    유기농 배추
    IIS
    윈도우서버
    셀프칭찬
    인증서
    HTTP
    SIP
    alteon
    인터넷전화
    해외발신
    URL Rewrite
    회사생활
    최단경로
    딕셔너리
    브로드웍스
    SBC
    다익스트라
    파일명
    클라우드
    rtp inject
    파일명 없이 다운로드
    ADC
    시간복잡도
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
virbr0.net
BFS 알고리즘 (백준 2021번: 최소 환승 경로)
상단으로

티스토리툴바