문제
https://www.acmicpc.net/problem/2644
2644번: 촌수계산
사람들은 1, 2, 3, …, n (1 ≤ n ≤ 100)의 연속된 번호로 각각 표시된다. 입력 파일의 첫째 줄에는 전체 사람의 수 n이 주어지고, 둘째 줄에는 촌수를 계산해야 하는 서로 다른 두 사람의 번호가 주어
www.acmicpc.net
문제 요약
n명의 부모 자식들 간 관계를 m개 입력 받고, 서로 다른 두 사람의 촌수를 출력한다.
+ 기본적으로 부모와 자식 사이를 1촌으로 정의한다.
+ 사람들은 1, 2, 3, ... 의 연속된 번호로 각각 표시된다.
+ 각 사람의 부모는 최대 한 명만 주어진다.
코드
from collections import deque
def bfs():
queue = deque([a])
# a 노드부터 bfs 탐색을 위해 큐에 삽입
check[a] = 0
# a와 a의 촌수는 0
while queue:
# 큐에 요소가 있을 동안 반복
v = queue.popleft()
# v는 현재 탐색하는 노드 (큐에서 제거)
for i in graph[v]:
# 노드 v가 이동 가능한 노드들 탐색
if check[i] == -1:
# 방문하지 않았던 노드라면
queue.append(i)
# 큐에 추가
check[i] = check[v] + 1
# i의 촌수 저장
n = int(input()) # 전체 사람 수
a, b = map(int, input().split()) # 촌수를 계산할 사람의 번호
m = int(input()) # 부모 자식 관계 수
graph = [[] for _ in range(n + 1)] # graph[0]은 사용 x
# i번 노드가 어느 노드로 이동 가능한지(몇 번과 부모 관계인지) 저장된 graph
# 인접 리스트로 그래프 구현
for i in range(m):
num1, num2 = map(int, input().split())
graph[num1].append(num2)
graph[num2].append(num1)
check = [-1] * (n + 1) # check[0]은 사용 x
# check[i]는 a부터 i까지의 거리 (촌수)
bfs()
print(check[b])
코드 설명
1. 촌수를 계산할 사람의 두 사람의 번호를 a, b로 입력 받는다.
2. 사람들의 부모 관계를 저장하는 인접 리스트 graph를 생성한다.
3. a부터 BFS(넓이 우선 탐색)로 check 배열을 갱신하는 함수 bfs를 정의한다. (큐 이용)
+ check[i]는 a부터 i까지의 촌수를 저장한다. (초기 값: -1)
4. check[b]를 출력한다.
'Algorithm Problems > 그래프' 카테고리의 다른 글
[백준/Python] 2468번: 안전 영역 (2) | 2023.08.29 |
---|---|
[백준/Python] 1260번: DFS와 BFS (2) | 2023.08.28 |
[백준/python] 13023번: ABCDE (0) | 2023.08.27 |
[백준/python] 10026번: 적록색약 (2) | 2023.08.06 |
[백준/python] 1012번: 유기농 배추 (2) | 2023.08.06 |