https://www.acmicpc.net/problem/1967
트리의 지름 구하기
- 트리의 아무 노드에서 시작해서 dfs를 수행하여 가장 길이가 먼 노드를 구한다. 그럼 그 노드가 리프 노드가 된다.
- 앞에서 찾은 리프 노드에서 동일한 dfs를 수행하여 가장 긴 길이가 지름이 된다.
import sys
sys.setrecursionlimit(10 ** 8)
input = sys.stdin.readline
N = int(input())
graph = [[] for _ in range(N+1)]
for i in range(N-1):
parent, child, dist = map(int, input().split())
graph[parent].append((child, dist))
graph[child].append((parent, dist))
dists = [-1] * (N+1)
dists[1] = 0
def dfs(n, dist):
for node in graph[n]:
c, d = node[0], node[1]
if dists[c] == -1:
dists[c] = dist + d
dfs(c, dist + d)
dfs(1, 0)
start = dists.index(max(dists))
dists = [-1] * (N+1)
dists[start] = 0
dfs(start, 0)
print(max(dists))
방문 처리를 dists 배열로 하였다. dists 배열은 각 노드까지의 거리를 저장한다. 시작 노드의 거리를 0으로 초기화하고 dfs를 시작한다.
1에서 첫 dfs를 수행했고, 이를 통해 리프노드를 구해서 또 한번 dfs를 수행했다.
728x90
'파이썬 알고리즘 문제 풀이' 카테고리의 다른 글
[프로그래머스] Lv1. 과일 장수 파이썬 (1) | 2024.03.27 |
---|---|
[프로그래머스] Lv1. 달리기 경주 파이썬 (0) | 2024.03.27 |
[백준] G5. boj2293 동전1 / 분류 : DP 🙁 (1) | 2024.03.25 |
[백준] G5. boj14502 연구실 / 분류: bfs 🙁 (0) | 2024.03.25 |
[백준] S3.Boj9375번 패션왕 신해빈 / 분류: 해시 (0) | 2024.03.25 |