문제 링크
풀이
bfs/dfs를 이용하여 풀 수 있다.
임의의 점을 하나 잡고, 그 점에서 가장 먼 점을 구한다. 그때 이 가장 먼 점을 a라고 하자.
a에서 가장 먼 점을 구한다. 그때 이 점을 b라고 하자.
그럼 이때 a, b의 거리가 트리의 지름이 되고, 이 두 점이 트리에서 가장 먼 두 점이다.
그럼 이제 이 두 점 사이 거리를 제외한 가장 먼 거리를 찾아야하기 때문에, a에서 b를 제외한 가장 먼 거리를 구하고, b에서 a를 제외한 가장 먼 점을 구하면, 두번째 트리의 지름이 나온다.
코드
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
vector<pair<int, int>> v[N];
queue<int> q;
bool visited[N];
int dist[N];
pair<int, int> bfs(int s, int rmv = 0) {
memset(visited, false, sizeof(visited));
memset(dist, 0, sizeof(dist));
q.push(s);
visited[rmv] = true;
while (!q.empty()) {
int cur = q.front();
q.pop();
visited[cur] = true;
for (auto [nxt, d] : v[cur]) {
if (visited[nxt]) continue;
q.push(nxt);
dist[nxt] = dist[cur] + d;
}
}
int *ret = max_element(dist, dist + N);
// 가장 큰 값의 인덱스, 가장 큰 값
return {ret - dist, *ret};
}
int main() {
cin.tie(0) -> sync_with_stdio(0);
int n; cin >> n;
for (int i = 0; i < n - 1; i++) {
int a, b, c; cin >> a >> b >> c;
v[a].push_back({b, c});
v[b].push_back({a, c});
}
int a = bfs(1).first;
int b = bfs(a).first;
cout << max(bfs(a, b).second, bfs(b, a).second);
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[5446] 용량 부족 (0) | 2021.11.16 |
---|---|
백준[17831] 대기업 승범이네 (0) | 2021.11.15 |
백준[16978] 수열과 쿼리 22 (0) | 2021.11.13 |
백준[11375] 열혈강호 (0) | 2021.11.13 |
백준[2188] 축사 배정 (0) | 2021.11.13 |