ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 19581. 두 번째 트리의 지름
    PS/Java 2022. 7. 19.

    트리에 N개의 정점이 있고, 각 정점 별로 1부터 N까지의 번호가 붙어있다.

    트리에서 가장 먼 두 정점 간의 거리를 트리의 지름이라고 한다. 트리의 지름을 구하는 문제는 너무 많기 때문에 우리는 두 번째 트리의 지름을 구하려고 한다.

     

    두 번째 트리의 지름은 무엇이냐? 바로 두 번째로 가장 먼 두 정점 간의 거리를 의미한다. (두 번째 트리의 지름은 트리의 지름과 같을 수 있다.)

    바로 두 번째 트리의 지름을 구해보자.


    입력

    첫 번째 줄에는 정점의 개수 N(3 ≤ N ≤ 100,000)이 들어온다.

    둘째 줄부터 N번째 줄까지 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수와 두 번째 정수는 간선과 연결된 정점 번호를 나타내고, 세 번째 정수는 간선의 가중치를 나타낸다. 간선의 가중치는 20,000 이하의 자연수이다.

    출력

    첫째 줄에 두 번째 트리의 지름을 출력한다.


    예제 입력

    7
    1 2 1
    2 3 2
    1 4 3
    1 5 1
    5 6 1
    6 7 1

    예제 출력

    6

    트리의 지름을 구하는 방법은(2022.07.19 - [PS/Java] - [백준] 1967. 트리의 지름)과 동일하다

    두번째 트리의 지름을 구해야 하는데 임의의 정점으로부터 가장 먼 정점 A를 찾고

    A로부터 가장 먼 정점 B를 찾아 트리의 지름을 구한다.

    A로부터 B를 제외한 가장 먼 정점까지의 거리, B로부터 A를 제외한 가장 먼 정점까지의 거리를 구하고

    두 값의 최대값을 구하면 두 번째 트리의 지름을 구할 수 있다. 제외하는 이유는 해당 값이 항상 첫 번째 가장 큰 트리의 지름이기 때문이다.

    import java.io.BufferedReader;
    import java.io.BufferedWriter;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    
    public class Main {
        public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        public static int N, maxTo, maxW;
        public static int a, b, minA, minB;
        public static ArrayList<Node>[] adjList;
        public static boolean[] visited;
        public static class Node {
            int next;  // 누구랑 연결되어있는지
            int w;      // 가중치
    
            public Node (int next, int w) {
                this.next = next;
                this.w = w;
            }
        }
        
        public static void main(String[] args) throws Exception {
            N = Integer.parseInt(br.readLine());
            adjList = new ArrayList[N + 1];
    
            for(int i = 1; i <= N; i++) {
                adjList[i] = new ArrayList<>();
            }
            
            for(int i = 0; i < N - 1; i++) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                int from = Integer.parseInt(st.nextToken());
                int to = Integer.parseInt(st.nextToken());
                int weight = Integer.parseInt(st.nextToken());
    
                adjList[from].add(new Node(to, weight));
                adjList[to].add(new Node(from, weight));
            }
    
            maxTo = 0;
            visited = new boolean[N + 1];
            maxW = Integer.MIN_VALUE;
            dfs(1, 0);  // 어디까지 제일 먼지 체크해서 값 기억
            // maxTo, maxW 구해짐 -> a
            a = maxTo;
    
    
            visited = new boolean[N + 1];
            maxW = Integer.MIN_VALUE;
            dfs(maxTo, 0);
            b = maxTo;
    
    
            visited = new boolean[N + 1];
            visited[b] = true;
            maxW = Integer.MIN_VALUE;
            dfs(a, 0);
            minA = maxW;
    
            visited = new boolean[N + 1];
            visited[a] = true;
            maxW = Integer.MIN_VALUE;
            dfs(b, 0);
            minB = maxW;
    
            bw.write(Math.max(minA, minB) + "");
            
            br.close();
            bw.flush();
            bw.close();
        }
    
        public static void dfs(int from, int dist) {
            if(visited[from]) {
                return;
            }
            if(maxW < dist) {
                maxTo = from;
                maxW = dist;
            }
            visited[from] = true;
            for(int i = 0; i < adjList[from].size(); i++) {
                Node nextNode = adjList[from].get(i);
                int next = nextNode.next;
                int w = nextNode.w;
                if(!visited[next]) {
                    dfs(next, dist + w);
                }
            }
        }
    }

    'PS > Java' 카테고리의 다른 글

    [백준] 1865. 웜홀  (0) 2022.07.19
    [백준] 10026. 적록색약  (0) 2022.07.19
    [백준] 1967. 트리의 지름  (0) 2022.07.19
    [백준] 11441. 합 구하기  (0) 2022.07.19
    [백준] 7786. 합 찾기  (0) 2022.07.19

    댓글

Designed by Tistory.