오늘 풀어볼 문제는 백준 1167번 문제 "트리의 지름" 이다.
이 문제는 실버1 문제이고 넓이 우선 탐색 문제이다.
문제
트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.
입력
트리가 입력으로 주어진다.
먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다.
정점 번호는 1부터 V까지 매겨져 있다.
먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다.
예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다.
각 줄의 마지막에는 -1이 입력으로 주어진다. 주어지는 거리는 모두 10,000 이하의 자연수이다.
출력
첫째 줄에 트리의 지름을 출력한다.
📌첫 번째 도전📌
위 문제는 Edge라는 클래스를 만들어서 목적지 노드와 가중치를 저장해줬다. 또 문제를 풀기위해 BFS를 활용했다.
public class Main {
static int N;
static boolean visited[];
static int[] distance;
static ArrayList<Edge>[] arr;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
arr = new ArrayList[N+1];
visited = new boolean[N+1];
for(int i=1; i<=N; i++) {
arr[i] = new ArrayList<Edge>();
}
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
int s = Integer.parseInt(st.nextToken());
while(true) {
int e = Integer.parseInt(st.nextToken());
if (e == -1) {
break;
}
int v = Integer.parseInt(st.nextToken());
arr[s].add(new Edge(e,v));
}
}
distance = new int[N+1];
visited = new boolean[N+1];
BFS(1);
int max = 1;
for(int i=2; i<=N; i++) {
if(distance[max] < distance[i]){
max = i;
}
}
distance = new int[N+1];
visited = new boolean[N+1];
BFS(max);
Arrays.sort(distance);
System.out.println(distance[N]);
}
private static void BFS(int index) {
Queue<Integer> queue = new LinkedList<Integer>();
queue.add(index);
visited[index] = true;
while(!queue.isEmpty()) {
int now_node = queue.poll();
for(Edge i : arr[now_node]) {
int e = i.e;
int v = i.value;
if(!visited[e]) {
visited[e] = true;
queue.add(e);
distance[e] = distance[now_node] + v;
}
}
}
}
static class Edge {
int e;
int value;
public Edge(int e, int value) {
this.e = e;
this.value = value;
}
}
}