Go, Vantage point
가까운 곳을 걷지 않고 서는 먼 곳을 갈 수 없다.
Github | https://github.com/overnew/
Blog | https://everenew.tistory.com/
티스토리 뷰
문제
https://www.acmicpc.net/problem/1967
풀이
solved.ac 난이도: Gold 4
트리의 높이를 구하는 것을 응용한 문제. 비슷한 문제를 미리 풀어서 쉽게 해결했다.
[알고스팟] FORTRESS - 요새 (C++, 트리)
부모 노드에서 자식 노드로 가는 것은 가중치(cost)가 추가된다.
두 노드 사이의 경로의 비용합이 최대인 것이 트리의 지름이 된다.
지름이 되는 두 노드는 두가지 경우가 존재한다.
1. 루트 노드와 가장 거리가 먼 잎 노드
루트 노드에서 자식 노드를 DFS 형식으로 방문하며 끝 노드까지의 총 cost 합 중에서 가장 큰 값이 답이 된다.
2. 잎 노드와 잎 노드 사이의 경로의 합
문제의 예제와 같이 잎과 잎 사이가 지름이 되는 경우이다.
이 두가 지 경우 이외에는 답이 존재하지 않는 이유는 자식 노드를 가지는 노드를 지름의 끝 노드로 설정한다면
하위 노드로 더 내려가는 것이 비용을 더 증가시킬 수 있기 때문이다.
2번의 경우는 방문한 노드가 두 개 이상의 자식 노드를 가진다면
각 자식 노드 깊이를 구한 후, 정렬하여 가장 큰 두 길이를 합하는 것이 해당 노드가 root일때 가장 큰 잎과 잎 사이의 경로합이다.
이를 전역 변수 longest와 비교하며 더 크다면 저장해 주자.
최종적으로 1,2번의 값 중에서 더 큰 것이 정답이 된다.
다른 풀이 중에서는 Moon님의 해설을 추천한다.
백준 1967번 - 트리의 지름 - Moon - 티스토리
코드
'알고리즘 공부 > 백준' 카테고리의 다른 글
[백준] No.11438 - LCA 2 (C++, 최소 공통 조상) (2) | 2021.02.06 |
---|---|
[백준] No.11437 - LCA (C++, 최소 공통 조상) (0) | 2021.02.06 |
[백준] No.2263 - 트리의 순회 (C++, 트리) (0) | 2021.02.04 |
[백준] No.3015 - 오아시스 재결합 (C++, 스택) (0) | 2021.02.01 |
[백준] No.3190 - 뱀 (C++, 큐) (0) | 2021.01.31 |