프로필사진

Go, Vantage point

가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.


Github | https://github.com/overnew/

Blog | https://everenew.tistory.com/





티스토리 뷰

반응형

문제

 

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

 

1967번: 트리의 지름

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

www.acmicpc.net

 

풀이

 

solved.ac 난이도: Gold 4

 

 

트리의 높이를 구하는 것을 응용한 문제. 비슷한 문제를 미리 풀어서 쉽게 해결했다.

[알고스팟] FORTRESS - 요새 (C++, 트리)

 

부모 노드에서 자식 노드로 가는 것은 가중치(cost)가 추가된다.

 

두 노드 사이의 경로의 비용합이 최대인 것이 트리의 지름이 된다.

지름이 되는 두 노드는 두가지 경우가 존재한다.

 

1. 루트 노드와 가장 거리가 먼 잎 노드

 루트 노드에서 자식 노드를 DFS 형식으로 방문하며 끝 노드까지의 총 cost 합 중에서 가장 큰 값이 답이 된다.

 

2. 잎 노드와 잎 노드 사이의 경로의 합

 문제의 예제와 같이 잎과 잎 사이가 지름이 되는 경우이다.

이 두가 지 경우 이외에는 답이 존재하지 않는 이유는 자식 노드를 가지는 노드를 지름의 끝 노드로 설정한다면

하위 노드로 더 내려가는 것이 비용을 더 증가시킬 수 있기 때문이다.

 

2번의 경우는 방문한 노드가 두 개 이상의 자식 노드를 가진다면

각 자식 노드 깊이를 구한 후, 정렬하여 가장 큰 두 길이를 합하는 것이 해당 노드가 root일때 가장 큰 잎과 잎 사이의 경로합이다.

이를 전역 변수 longest와 비교하며 더 크다면 저장해 주자.

 

최종적으로 1,2번의 값 중에서 더 큰 것이 정답이 된다.

 

다른 풀이 중에서는 Moon님의 해설을 추천한다.

백준 1967번 - 트리의 지름 - Moon - 티스토리

 

코드

 

 

반응형
댓글
반응형
인기글
Total
Today
Yesterday
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함