Study/Problem Solving

[BOJ_1967] 트리의 지름

monitor 2023. 12. 23. 19:22

설명


트리의 각 노드별로 출발해서 어디가 제일 긴 edge 값을 가지는 것인지 판별하는 문제였다. N이 10000이여서 10000*10000 해보니 1억정도라서 아래와 같이 코드를 짜서 모든 노드에서 출발해서 탐색하는 식으로 풀었는데 다른 사람의 풀이를 보니 루트로 부터 한 번 돌리고 루트로 부터 가장 먼 노드를 구해서 탐색하는 식으로 구현하는 방법도 있었다. 

 

사실 탐색 문제의 경우 처음 길을 잘 들여 놓으면 너무 쉬운 문제들이라 크게 설명 할 것이 없다. 초보자라면 차근 차근 재귀의 형태를 실제로 그려보면서 푸는 것도 좋은 방법일듯 하다. 

코드


package tree;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class BOJ_1967 {
    static class Node {
        int node;
        int weight;
        public Node(int node, int weight) {
            this.node = node;
            this.weight = weight;
        }
    }
    static boolean visited[];
    static List<Node>[] listNode;
    static int ans;
    public static void main(String[] args) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer tk = new StringTokenizer(in.readLine(), " ");
        int N = Integer.parseInt(tk.nextToken());
        visited = new boolean[N + 1];
        listNode = new ArrayList[N + 1];
        for (int i = 0; i < listNode.length; i++) {
            listNode[i] = new ArrayList<Node>();
        }
        ans = 0;
        for (int i = 0; i < N - 1; i++) {
            tk = new StringTokenizer(in.readLine(), " ");
            int a = Integer.parseInt(tk.nextToken());
            int b = Integer.parseInt(tk.nextToken());
            int d = Integer.parseInt(tk.nextToken());
            listNode[a].add(new Node(b, d));
            listNode[b].add(new Node(a, d));

        }

        for (int i = 1; i <= N; i++) {
            visited = new boolean[N + 1];
            dfs(i,0);
        }
        System.out.println(ans);
    }
    private static void dfs(int idx, int cnt) {
        visited[idx] = true;
        ans = Math.max(cnt, ans);
        for (Node node : listNode[idx]) {
            if (!visited[node.node]) {
                visited[node.node] = true;
                dfs(node.node, cnt + node.weight);
            }
        }
    }
}
 

1967번: 트리의 지름

파일의 첫 번째 줄은 노드의 개수 n(1 ≤ n ≤ 10,000)이다. 둘째 줄부터 n-1개의 줄에 각 간선에 대한 정보가 들어온다. 간선에 대한 정보는 세 개의 정수로 이루어져 있다. 첫 번째 정수는 간선이 연

www.acmicpc.net