💡Problem Solving/BOJ
[BOJ 1167] 트리의 지름 (Java)
gom20
2022. 1. 2. 18:58
문제
https://www.acmicpc.net/problem/1167
1167번: 트리의 지름
트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지
www.acmicpc.net
풀이
트리의 지름을 구하는 공식을 알면 쉽게 풀 수 있다.
트리 내 임의 정점을 선택하여 해당 노드에서 거리가 가장 먼 노드를 구한다.
해당 노드에서 DFS 알고리즘을 수행하여 가장 먼 거리를 구하면 그 값이 트리의 지름이 된다.
아래 블로그 내용을 참고하였다.
트리의 지름 구하기
트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 1. 트리에서 임의의 정점 $x$를
blog.myungwoo.kr
소스코드
package tree;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class BOJ1167 {
static int V;
static class Edge{
int to;
int weight;
public Edge(int to, int weight){
this.to = to;
this.weight = weight;
}
}
static ArrayList<Edge>[] adjs = null;
static boolean[] visited;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
V = Integer.parseInt(br.readLine());
adjs = new ArrayList[V+1];
for(int i = 1; i <= V; i++){
adjs[i] = new ArrayList<Edge>();
}
StringTokenizer st = null;
for(int i = 1; i <= V; i++){
st = new StringTokenizer(br.readLine());
int from = Integer.parseInt(st.nextToken());
while(true){
int to = Integer.parseInt(st.nextToken());
if(to == -1) break;
int weight = Integer.parseInt(st.nextToken());
adjs[from].add(new Edge(to, weight));
}
}
// 임의 정점에서 가장 먼 노드 구하기
visited = new boolean[V+1];
visited[1] = true;
dfs(1, 0);
// 위에서 구한 노드에서 가장 먼 거리 구하기
max = 0;
visited = new boolean[V+1];
visited[target] = true;
dfs(target, 0);
System.out.println(max);
}
static int max, target;
public static void dfs(int v, int weight){
if(max < weight){
max = weight;
target = v;
}
for(Edge e : adjs[v]){
if(visited[e.to]) continue;
visited[e.to] = true;
dfs(e.to, e.weight + weight);
}
}
}