알고리즘/트리

트리의 지름 - 백준 1967번

jwjwvison 2022. 9. 2. 14:43

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

 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net

 

 

DFS를 사용해 트리를 추적하는 문제이다.

먼저 말단 노드까지 도착한 뒤 올라오면서 왼쪽 오른쪽 자식 노드들의 길이와 합을 구한다.

트리의 지름은 무조건 왼쪽 최장경로 + 오른쪽 최장경로 이다.

 

DFS로 리프 노드까지 내려간 뒤 해당 노드의 가중치를 리턴한다.그리고 자식 노드가 있는 부모 노드부터는 자식들의 경로들 중 가장 큰 두 길이를 선택한다.두 길이를 더한 것은 현재 노드를 기준으로 지름이 된다.어느 기준 노드의 지름이 가장 클 지 알 수 없으니 지름을 전역 변수로 하나 생성해두고 더 큰 지름이 나올 때마다 갱신해준다.상위 부모 노드로 갱신해줄 때에는 왼쪽과 오른쪽 경로 중 더 큰 것을 리턴해준다.

 

import sys
from collections import defaultdict
sys.setrecursionlimit(10**6)

N=int(input())
tree=defaultdict(list)
maxDist=0
for _ in range(N-1):
    root,child,weight=map(int,sys.stdin.readline().split())
    tree[root].append([child,weight])

def dfs(node,weight):
    left,right=0,0
    for child,w in tree[node]:
        r=dfs(child,w)
        if left<=right:
            left=max(left,r)
        else:
            right=max(right,r)
            
    global maxDist
    maxDist=max(maxDist,left+right)
    return max(left+weight,right+weight)

dfs(1,0)
print(maxDist)

'알고리즘 > 트리' 카테고리의 다른 글

트리 순회  (0) 2022.05.10
이진 탐색 트리(BST) 노드 간 최소 거리  (0) 2022.05.09
이진 탐색 트리(BST) 합의 범위  (0) 2022.05.08
정렬된 배열의 이진 탐색 트리 변환  (0) 2022.05.08
이진 탐색 트리  (0) 2022.05.08