꺼내먹는지식 준

백준 1240 노드사이의 거리 [python] 본문

코딩테스트총정리/DFS, BFS

백준 1240 노드사이의 거리 [python]

알 수 없는 사용자 2022. 2. 20. 18:33
 

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

 

1240번: 노드사이의 거리

N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.

www.acmicpc.net

문제

N(2≤N≤1,000)개의 노드로 이루어진 트리가 주어지고 M(M≤1,000)개의 두 노드 쌍을 입력받을 때 두 노드 사이의 거리를 출력하라.

입력

첫째 줄에 노드의 개수 N이 입력되고 다음 N-1개의 줄에 트리 상에 연결된 두 점과 거리(10,000 이하의 정수)를 입력받는다. 그 다음 줄에는 거리를 알고 싶은 M개의 노드 쌍이 한 줄에 한 쌍씩 입력된다.

출력

M개의 줄에 차례대로 입력받은 두 노드 사이의 거리를 출력한다.

예제 입력 1 복사

4 2
2 1 2
4 3 2
1 4 3
1 2
3 2

예제 출력 1 복사

2
7

 

풀이: 트리 구조는 여러 노드가 한 노드를 가리킬 수 없는 구조라는 것만 기억하자. 

bfs 탐색을 위해 각 간선간의 관계를 선언 후, 

bfs를 수행하면 된다. 

약간의 trick은 visit 을 -1로 초기화 하고, 노드에서 다음 노드로 건너갈 때 weight를 더해준다. 

첫 노드의 weight는 0으로 선언한다. (-1은 방문 안한 노드, 0으로 설정해야 weight더했을 때 문제 X)

 

visit 을 선언 할 때 visit = [0]*n 으로 선언하고 1 부터 시작하는 graph시 indexing을 위해 n-1 형태로 접근 했는데 

오늘부터 고집을 꺾고 visit = [0] * (n+1) 선언하기로 한다. 

 

이 문제는 LCA 로 해결이 가능하다고 한다. 

시간 복잡도를 많이 단축할 수 있다고 하는데, 아직 BFS 도 바로 바로 잘 안되는 나로써는 좀 더 시간을 갖고 나중에 도전해보도록 한다. 

import sys
input = sys.stdin.readline
from collections import deque

n,m = map(int, input().split())
#트리는 여러 노드가 한 노드를 가리킬 수 없는 구조 

data = [[] for _ in range(n+1)]
q = deque()

def bfs(s,e):
    q.append(s)
    visited = [-1] * (n+1)
    visited[s] = 0
    while q:
        tmp = q.popleft()
        for node, d in data[tmp]:
            if visited[node] != -1:
                continue
            visited[node] = visited[tmp] + d
            if node == e:
                q.clear()
                return visited[e]
            else:
                q.append(node)
    return visited[e]


for _ in range(n-1):
    _s, _e, _d = map(int, input().split())
    data[_s].append((_e, _d))
    data[_e].append((_s,_d))

for _ in range(m):
    s,e = map(int, input().split())
    print(bfs(s,e))

'코딩테스트총정리 > DFS, BFS' 카테고리의 다른 글

프로그래머스 타겟 넘버  (0) 2022.05.06
백준 2146 다리 만들기  (0) 2022.03.09
백준 7576 토마토 [파이썬]  (0) 2022.02.18
Comments