반응형
https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말합니다. 트리의 지름을 구하는 기본 알고리즘은 다음과 같습니다.
- 임의의 한 노드 A를 선택합니다.
- 노드 A에서 가장 먼 노드 B를 찾습니다.
- 노드 B에서 가장 먼 노드 C를 찾습니다.
- 노드 B와 노드 C 사이의 경로의 길이가 트리의 지름입니다.
더 긴 지름이 존재한다면 모순임을 보이면 증명됩니다.
코드는 다음과 같이 작성해 보았습니다.
#include <bits/stdc++.h> using namespace std; int v; vector<pair<int, int>> tree[100001]; bool visited[100001]; pair<int, int> r = {1, 0}; void getFar(int i, int p) { visited[i] = true; if (r.second < p) r = {i, p}; for (auto [ii, pp] : tree[i]) { if (visited[ii]) continue; getFar(ii, p + pp); } visited[i] = false; } int main() { cin >> v; for (int i = 0; i < v; i++) { int a, b = 0, c; cin >> a; while (b != -1) { cin >> b; if (b == -1) break; cin >> c; tree[a].push_back({b, c}); } } getFar(1, 0); r.second = 0; getFar(r.first, 0); cout << r.second; }
DFS를 두 번 이용하는 코드로, 첫 번째 DFS에서는 임의의 노드 (1번 노드)에서 가장 먼 노드를 찾아 r에 넣고, 해당 노드에서 다시 DFS를 돌려서 가장 먼 노드를 찾습니다. 이 때의 경로의 길이가 트리의 지름입니다.
관련 문제
1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연
www.acmicpc.net
반응형
댓글