알고리즘
[알고리즘] 백준 - 1240 노드 사이의 거리
j9972
2022. 7. 20. 17:05
728x90
접근
- 두 노드 사이의 거리를 출력하기
- bfs 로 풀기
- 간선에 대한 정보를 추가할때 튜플로 묶어서 추가하면 된다
그래프 생성
- 리스트는 0부터 시작을 하므로, board에 n+1 개수만큼의 노드를 생성해준다.
- 두 노드 번호와 간선의 정보를 입력 받고, 그래프에 추가시 ( 노드 번호, 간선 길이) 형태로 추가
- bfs 함수에 두 노드번호를 매개변수로 전달해 return 받은 노드 사이의 거리 출력
두 노드 사이 구하는 함수 ( bfs() )
- 매개변수로 시작 노드와 찾는 노드 번호를 입력받는다.
- queue를 생성하고, 시작 노드와 거리는 0으로 초기화한다.
- 여러번의 테스트케이스를 실행해야하므로 visited 변수는 bfs 안에 생성했다.
- popleft 해서 현재 노드와 d를 가져오는데, d는 start 노드로부터 현재 노드 v까지의 거리를 의미한다.
당연히 처음엔 start를 입력하고 바로 노드를 뺐으므로 d에는 0이 나온다.
- 현재 노드 v가 찾고자하는 노드일 경우 d를 return 해준다.
- 현재 노드 v와 연관된 노드를 가져온다. board에는 두개의 정보(노드번호, 연결 길이) 가 들어있으므로 for문에서 i와 l로 받아왔다.
- 방문하지 않은 노드일 경우 방문처리해주고, queue에 (연관된 노드번호 i, 지금까지의거리) 를 설정해준다.
풀이
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
def distance(start, find):
queue = deque()
queue.append((start, 0))
visited = [False] * (n+1)
visited[start] = True
while queue:
v, d = queue.popleft()
if v == find:
return d
for i, l in board[v]:
if visited[i] == False:
visited[i] = True
queue.append((i, d+l))
board = [[] for _ in range(n+1)]
for _ in range(n-1):
a, b, c = map(int, input().split())
board[a].append((b, c))
board[b].append((a, c))
for _ in range(m):
a, b = map(int, input().split())
print(distance(a, b))