-
[1167] 트리의 지름BOJ 2022. 2. 10. 01:08
https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
<문제>
아무 노드를 하나 잡고 거리가 가장 먼 노드가 트리의 지름을 이루는 첫 번째 노드이고,
그 노드에서 가장 먼 노드가 트리의 지름을 이루는 두 번째 노드다.
증명도 직관적이고, typical한 유형인 것 같지만, dfs와 트리의 정의만 아는 상태에서 떠올리기엔 만만찮다.
<소스코드>
#include <bits/stdc++.h>using namespace std;using pi = pair<int, int>;vector<pi> adj[100001];int n, ansIdx, ans;bool vst[100001];void f(int cur, int cost) {if (ans < cost) {ans = cost;ansIdx = cur;}for (auto& nxt : adj[cur]) {if (vst[nxt.first] == false) {vst[nxt.first] = true;f(nxt.first, cost + nxt.second);}}}int main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cin >> n;int i, j;for (i = 0; i < n; i++) {int idx;cin >> idx;while (1) {int A, B;cin >> A;if (A == -1) break;cin >> B;adj[idx].push_back({A, B});adj[A].push_back({idx, B});}}vst[1] = true;f(1, 0);
memset(vst, 0, sizeof(vst));ans = 0;
vst[ansIdx] = true;f(ansIdx, 0);
cout << ans;return 0;}'BOJ' 카테고리의 다른 글
[11758] CCW (0) 2022.02.11 [1035] 조각 움직이기 (0) 2022.02.10 [1240] 노드사이의 거리 (0) 2022.02.09 [1865] 웜홀 (0) 2022.02.08 [1039] 교환 (0) 2022.02.07