💡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 알고리즘을 수행하여 가장 먼 거리를 구하면 그 값이 트리의 지름이 된다.

 

아래 블로그 내용을 참고하였다.

https://blog.myungwoo.kr/112

 

트리의 지름 구하기

트리에서 지름이란, 가장 먼 두 정점 사이의 거리 혹은 가장 먼 두 정점을 연결하는 경로를 의미한다. 선형 시간안에 트리에서 지름을 구하는 방법은 다음과 같다: 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);
        }
    }
}

'💡Problem Solving > BOJ' 카테고리의 다른 글

[BOJ 18352] 특정 거리의 도시 찾기 (Python)  (0) 2022.11.17
[BOJ 3190] 뱀 (Python)  (0) 2022.11.16
[BOJ 10159] 저울 (Java)  (0) 2022.01.01
[BOJ 11779] 최소비용 구하기 2 (Java)  (0) 2021.12.30
[BOJ 6603] 로또 (Java)  (0) 2021.12.28