1967번: 트리의 지름
파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n번째 줄까지 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 ��
www.acmicpc.net
무방향 그래프가 가중치를 포함하여 주어진 트리에서 트리의 지름을 구하는 문제이다.
지름은 가중치가 가장 긴 값이 지름이 된다.
문제는 이해가 되는데 트리의 지름에 대한 개념이 없어서 어떻게 풀어야 할지 감이 안 잡혀 다른 분들의 코드를 참고했다.
정해는 부모 노드에서 DFS를 돌려서 가장 큰 값이 나온 그 노드를 저장하고, 그 노드에서 다시 DFS를 돌려서 가장 큰 값이 나온다면 그 값이 지름이 된다.
문제 예시에서 보이듯 1에서 시작해서 DFS를 돌리면 9번 노드로 가게 될것이고, 9번 노드에서 DFS를 돌린다면 12번 노드로 갈 것이다.
#include <iostream>
#include <vector>
using namespace std;
bool vis[10001];
vector<pair<int, int>> ar[10001];
int ans, idx;
void dfs(int cur, int length) {
if (vis[cur]) return;
vis[cur] = true;
if (ans < length) {
ans = length; idx = cur;
}
for (auto i : ar[cur]) {
dfs(i.first, i.second + length);
}
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n - 1; i++) {
int x, y, z; cin >> x >> y >> z;
ar[x].push_back({ y,z });
ar[y].push_back({ x,z });
}
dfs(1, 0);
ans = 0;
fill(vis, vis + 10001, false);
dfs(idx, 0);
cout << ans << endl;
return 0;
}
어떻게 풀어야 할 지 알게 된 후 구현은 쉬웠던 것 같다.
'BOJ' 카테고리의 다른 글
백준 1655 가운데를 말해요 (0) | 2020.09.11 |
---|---|
백준 1167 트리의 지름 (0) | 2020.09.10 |
백준 11725 트리의 부모 찾기 (0) | 2020.09.10 |
백준 1991 트리 순회 (0) | 2020.09.10 |
백준 19699 소-난다! (0) | 2020.09.10 |