본문 바로가기
Problem Solving/DFS, BFS

[DFS, BFS] 백준 1167번: 트리의 지름 / 골드 3

by ggyongi 2021. 9. 1.
반응형

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

 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지

www.acmicpc.net

import collections
n = int(input())
graph = collections.defaultdict(list)

for i in range(n):
    row = list(map(int, input().split()))
    start = row[0]
    for j in range(1, len(row)-1, 2):
        next, w = row[j], row[j+1]
        graph[start].append([next, w])


global val
global max_node
val, max_node = 0, 0

def dfs(node, weight):
    global val
    global max_node

    if val < weight:
        val = weight
        max_node = node

    for next, w in graph[node]:
        if not visited[next-1]:
            visited[next-1] = True
            dfs(next, weight + w)


visited = [False for _ in range(n)]
visited[0] = True
dfs(1, 0)

visited = [False for _ in range(n)]
visited[max_node-1] = True
dfs(max_node, 0)

print(val)

 

트리의 지름 구하는 공식을 알고 있으면 구현은 쉽지만, 그 공식을 모르면 풀기가 힘들다.

 

<트리의 지름 구하는 공식>

임의의 노드에서 거리가 가장 긴 노드를 구함(그럼 이 도착 노드가 트리의 지름을 구성하는 양 끝 노드 중 한 노드임)

이 노드에서 다시 거리가 가장 긴 노드를 구함. 이때의 거리가 트리의 지름이 된다.

 

비전공자 네카라 신입 취업 노하우

시행착오 끝에 얻어낸 취업 노하우가 모두 담긴 전자책!

kmong.com

댓글