백준 1967 - 트리의 지름
Updated:
Java
1967 번 - 트리의 지름
문제
접근 방법
우선 트리를 그래프로 연결하듯이 노드끼리 List를 통해 연결한다.
- DFS를 통해 root 노드에서 leaf 노드 중, 도달 할 때까지 가중치가 가장 큰 노드를 구한다.
- 그리고 그 노드를 root로 시작하여 left 까지 다시 가중치가 가장 큰 노드를 구한다.
2번 과정에서 나온 가중치가 트리의 지름이다.
코드
import java.util.*;
import java.io.*;
public class Main {
static int n, result, max, deep;
static List<List<Node>> node;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = stoi(br.readLine());
StringTokenizer stk;
node = new ArrayList<>();
for(int i = 0; i <= n; i++) {
node.add(new ArrayList<Node>());
}
int a,b,c;
for(int i = 0; i < n - 1; i++) {
stk = new StringTokenizer(br.readLine());
a = stoi(stk.nextToken());
b = stoi(stk.nextToken());
c = stoi(stk.nextToken());
node.get(a).add(new Node(b,c));
node.get(b).add(new Node(a,c));
}
// 루트 노드, 이전 노드, 현재까지의 합
DFS(1, -1, 0);
max = 0;
DFS(deep, -1, 0);
System.out.println(max);
br.close();
}
static void DFS(int curN, int preV, int sum) {
if(max < sum) {
max = sum;
deep = curN;
}
int size = node.get(curN).size();
for(int i = 0; i < size; i++) {
if(node.get(curN).get(i).getName() != preV) {
DFS(node.get(curN).get(i).getName(), curN, sum + node.get(curN).get(i).getVal());
}
}
}
static int stoi(String str) {
return Integer.parseInt(str);
}
static class Node{
private int name;
private int val;
Node(int name, int val){
this.name = name;
this.val = val;
}
public int getName() {
return name;
}
public int getVal() {
return val;
}
}
}