목차

1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
- 다익스트라 알고리즘과 비슷하게 문제를 풀었습니다.
- 차이가 있다면 다익스트라는 우선순위 큐를 구현하여 사용한다는 점이지만, 이번 문제 풀이에서는 DFS, 즉 Stack을 사용하여 문제를 풀어도 충분한 문제입니다.
- 트리는 사이클이 없다는 점을 생각한다면 트리의 지름은 다음과 같이 구할 수 있습니다.
- 임의의 점 하나를 선택한 후, 그 점에서 가장 멀리 떨어져 있는 노드를 찾고, 그 노드에서 가장 멀리 떨어진 노드와의 거리가 트리의 지름입니다.
문제 풀이
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().trim().split("\\n");
const N = +input[0];
/*
각 노드는 배열을 가지고 있다
배열에는 다음노드에 대한 정보가 있다
{ next , distance }
*/
const nodes = Array.from({ length: N + 1 }, () => []);
for (let i = 1; i <= N; i++) {
const [node, ...arr] = input[i].split(" ").map(Number);
let index = 0;
while (1) {
const next = arr[index * 2];
if (next === -1) break;
const distance = arr[index * 2 + 1];
index++;
nodes[node].push({ next, distance });
}
}
//가장 먼 노드를 찾는 함수
function findFarNode(number) {
//number노드와의 거리를 distancArr에 기록합니다.
//사이클이 없기 때문에 다익스트라 알고리즘이 필요 없지만 구현은 가능합니다.
const distanceArr = Array(N + 1).fill(Infinity);
const stack = [];
stack.push(number);
distanceArr[number] = 0;
while (stack.length > 0) {
const cur = stack.pop();
for (let { next, distance } of nodes[cur]) {
if (distanceArr[next] > distanceArr[cur] + distance) {
distanceArr[next] = distanceArr[cur] + distance;
stack.push(next);
}
}
}
let returnNode = 0;
let returnDistance = 0;
distanceArr.forEach((v,i)=>{
if(v !== Infinity && v > returnDistance){
returnNode = i
returnDistance = v
}
})
return [returnNode,returnDistance]
}
const [farNode,_] = findFarNode(1);
console.log(findFarNode(farNode)[1])
반응형