yha97 2023. 3. 14. 16:08

날짜 : 2023. 03. 14

사용 언어 : python

 

문제

 

 

코드

import sys
sys.setrecursionlimit(10**9)

n = int(sys.stdin.readline())
graph = [[] for _ in range(n + 1)]


def dfs(now, d):  # 노드번호, 길이
    for i in graph[now]:
        if dist[i[0]] == -1:  # 길이 최신화 x
            dist[i[0]] = d + i[1]
            dfs(i[0], d + i[1])


for _ in range(n - 1):
    a, b, c = map(int, sys.stdin.readline().split())  # 트리 입력
    graph[a].append([b, c])
    graph[b].append([a, c])

# 1번 노드에서 가장 먼 노드를 찾는다
dist = [-1] * (n + 1)
dist[1] = 0  # 본인 노드
dfs(1, 0)

# 가장 먼 노드의 인덱스 확인
start = dist.index(max(dist))
dist = [-1] * (n + 1)
dist[start] = 0
dfs(start, 0)

print(max(dist))  # start 에서 가장 먼 노드를 찾고 그 길이 리턴 -> 지름

 

 

풀이

- 지름을 구하는 경우는 다음과 같다.

1. 트리에서 정점 x를 찾는다.

2. 정점 x에서 가장 긴 거리에 있는 정점 a를 찾는다.

3. 정점 a에서 가장 긴 거리에 있는 정점 b를 찾는다.

지름은 a와 b를 잇는 경로의 길이이다.

 

- 각 노드간 거리를 파악하기 위해 방향성이 없는 그래프를 만들고 임의의 노드(코드에서는 1)를 기준으로 dfs를 실행한다.

- 이후 해당 노드에서 가장 먼 거리에 있는 노드(start)를 찾고 그 노드를 기준으로 dfs를 실행 -> 가장 먼 거리의 노드를 찾는다.

- 그리고 start와 이를 기준으로 dfs를 돌려 나온 노드간 거리가 이 트리의 길이가 된다.

 

 

알게된 점

- 트리의 지름을 구하는 원리를 찾지 못해 꽤 많이 고민했다.

- 각 노드를 기준으로 가장 먼 거리의 노드 2개를 구해서 해볼까 했는게 구현방식이 떠오르지 않았다.

 

 

 

참고 사이트

- https://kyun2da.github.io/2021/05/04/tree's_diameter/

 

[백준 / Python] 1967 트리의 지름 - Kyun2da Blog

1️⃣ 서론

Kyun2da.github.io

- 트리의 지름 구하는 원리(귀류법으로 증명) : https://blog.myungwoo.kr/112

 

트리의 지름 구하기

트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를

blog.myungwoo.kr