[백준] 1967번 트리의 지름

2021년 05월 12일, 13:38

트리의 지름

문제풀이

dfs를 이용해서 풀었다.
특정 한 점에서 가장 먼 지점까지 가면, 그 가장 먼 지점은 원의 지름을 만드는 점 중 하나이다.
그래서 dfs로 지름의 한 점을 구하고, 구한 점으로부터 또 가장 먼 거리를 구하면 트리의 지름이 된다.

조심! 자바스크립트로 풀었는데, 재귀함수로 풀면 터진다.

소스코드

const log = console.log;
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
// const input = fs.readFileSync("./stdin").toString().trim().split("\n");

const N = +input[0];
const adj = Array.from(Array(N + 1), () => Array());
input.slice(1, N + 1).map((e) => {
  const [parent, child, cost] = e.split(" ").map((el) => +el);
  adj[parent].push([child, cost]);
  adj[child].push([parent, cost]);
});

const dfs = (start) => {
  const visited = Array(N + 1);
  const stack = [[start, 0]];
  let vertex = 0;
  let max = 0;
  while (stack.length) {
    const [start, total] = stack.pop();
    if (visited[start]) continue;
    const edges = adj[start];
    visited[start] = true;
    if (max < total) {
      max = total;
      vertex = start;
    }
    for (let i = 0; i < edges.length; i++) {
      const [next, cost] = edges[i];
      stack.push([next, total + cost]);
    }
  }
  return { vertex, max };
};

if (N === 1) {
  log(0);
  return;
}
log(dfs(dfs(1).vertex).max);