[필자 사고]
트리의 지름문제이다.
처음보면 당황할 수 있지만 한번만 이해하면 쉽게 풀 수 있는 문제이다.
트리의 지름이란 임의의 두점을 선택했을때 가장 거리가 긴 노드간의 길이를 말한다.
지름을 구하기 위해서는 다음과 같다.
1. 임의의 노드 하나를 선택하여 가장 거리가 먼 노드를 구한다.
2. 가장 거리가 먼 노드에서 다시 시작하여 가장 거리가 먼 노드를 또 구한다.
3. 2번째로 구한 가장 거리가 먼 노드의 길이가 지름의 길이이다.
문제를 해결하는 알고리즘은 dfs 다익스트라 등등 많이 있고 필자는 다익스트라를 이용하여 해결했다.
[소스 코드]
#include <iostream>
#include <vector>
#include <queue>
#include <climits>
using namespace std;
typedef pair<int, int> Node;
vector<vector<Node>> Arr;
vector<bool> visited;
vector<int> pathLoad;
int N;
void djistra(int start) {
priority_queue<Node, vector<Node>, greater<Node>> pq;
pq.push({ 0,start });
pathLoad[start] = 0;
while (!pq.empty()) {
int nowIdx = pq.top().second;
pq.pop();
if (visited[nowIdx] == true)continue;
visited[nowIdx] = true;
for (Node nextNode : Arr[nowIdx]) {
int nextIdx = nextNode.second;
int nextWeight = nextNode.first;
if (visited[nextIdx] == false &&
pathLoad[nextIdx] > pathLoad[nowIdx] + nextWeight) {
pathLoad[nextIdx] = pathLoad[nowIdx] + nextWeight;
pq.push({ pathLoad[nextIdx],nextIdx });
}
}
}
}
void Init() {
visited.clear();
pathLoad.clear();
visited.resize(N + 1, false);
pathLoad.resize(N + 1, INT_MAX);
}
void Input() {
cin >> N;
Arr.resize(N + 1);
Init();
for (int i = 1; i < N; i++) {
int start, end, weight;
cin >> start >> end >> weight;
Arr[start].push_back({ weight,end });
Arr[end].push_back({ weight,start });
}
}
void Solve() {
djistra(1);
int findIdx = -1;
int findMax = -1;
for (int i = 0; i <= N; i++) {
if (pathLoad[i] == INT_MAX)continue;
if (findMax < pathLoad[i]) {
findMax = pathLoad[i];
findIdx = i;
}
}
Init(); //방문 및 pathLoad 초기화
djistra(findIdx);
findMax = -1;
for (int i = 0; i <= N; i++) {
if (pathLoad[i] == INT_MAX)continue;
if (findMax < pathLoad[i]) {
findMax = pathLoad[i];
}
}
cout << findMax;
}
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
Input();
Solve();
}
'백준 > 트리' 카테고리의 다른 글
백준 1991 c++ "트리 순회" -PlusUltraCode- (0) | 2024.09.23 |
---|---|
백준 1068 c++ "트리" -PlusUltraCode- (0) | 2024.09.20 |
백준 11286 c++ "절댓값 힙" -[PlusUltraCode] (0) | 2024.04.19 |
백준 11279 c++ "최대 힙" -[PlusUltraCode] (0) | 2024.04.18 |
백준 1167 c++ - [PlusUltraCode] (0) | 2024.02.20 |