728x90
시간 제한 2초, 메모리 제한 128MB
# 조건
- N개의 노드로 이루어진 트리가 주어지고 M개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.
입력
- 첫째 줄에 노드의 개수 N과 거리를 알고 싶은 노드 쌍의 개수 M이 입력되고 다음 N-1개의 줄에 트리 상에 연결된 두 점과 거리를 입력받는다.
- 그 다음 줄에는 거리를 알고 싶은 $M$개의 노드 쌍이 한 줄에 한 쌍씩 입력된다.
출력
- M개의 줄에 차례대로 입력받은 두 노드 사이의 거리를 출력한다.
제한
- $2≤N≤1,000$
- $1≤M≤1,000$
- 트리 상에 연결된 두 점과 거리는 $10,000$ 이하인 자연수이다.
- 트리 노드의 번호는 $1$부터 $N$까지 자연수이며, 두 노드가 같은 번호를 갖는 경우는 없다.
# 접근 방법
- bfs를 활용하여 그래프 탐색을 해주면 된다.
- 입력받는 노드 간의 관계를 양방향으로 넣어주고, bfs를 돌려주면 된다.
- 이 때, M개의 줄에 주어지는 두 노드를 탐색할 때마다 VISITED 배열을 초기화해주면 된다.
import sys
sys.stdin = open('input.txt')
input = sys.stdin.readline
from collections import deque
def bfs(st, en):
q = deque()
q.append((st, 0))
visited[st] = True
while q:
cur_node, dist = q.popleft()
if cur_node == en:
print(dist)
return
for node, val in tree[cur_node]:
if not visited[node]:
visited[node] = True
q.append((node, dist + val))
N, M = map(int, input().split())
tree = [[] for _ in range(N+1)]
for _ in range(N-1):
a, b, c = map(int, input().split())
tree[a].append((b, c))
tree[b].append((a, c))
for _ in range(M):
visited = [False] * (N+1)
a, b = map(int, input().split())
bfs(a, b)
728x90
'ALGORITHM > DFS, BFS, 그래프 탐색' 카테고리의 다른 글
[백준 3187번] 파이썬 - 양치기 꿍 (1) | 2023.12.27 |
---|---|
[백준 12893번] 파이썬 - 적의 적 (1) | 2023.12.26 |
[백준 9466번] 파이썬 - 텀 프로젝트 (0) | 2023.09.18 |
[백준 15886번] 파이썬 - 내 선물을 받아줘2 (0) | 2023.09.15 |
[백준 14442번] 파이썬 - 벽 부수고 이동하기 2 (0) | 2023.09.11 |