반응형
01-15 06:58
Today
Total
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
관리 메뉴

개발하는 고라니

[백준] 1167번 : 트리의 지름 본문

Programming/백준

[백준] 1167번 : 트리의 지름

조용한고라니 2021. 2. 10. 13:24
반응형
 

1167번: 트리의 지름

트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2≤V≤100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. (정점 번호는 1부터 V까지

www.acmicpc.net

[DFS]

트리의 지름을 구하기 위해선, 1번 정점을 Root 정점으로 두고, 1번에서 DFS를 시작한다. 그 후 1번에서 가장 먼 정점 v1을 기록하고, v1에서 DFS를 해서 가중치의 합이 가장 큰 것을 반환하도록 한다.

 

처음에는, 입력을 받을 때 각 인접리스트의 사이즈가 가장 작은 것들을 배열이나 리스트에 담아서, 그 곳에 담긴 정점에서 DFS를 하며 가중치의 합이 가장 큰 곳을 찾아보았으나, 정점이 최대 10만개이기도 하고, 말단노드(간선이 1개인) 정점이 굉장히 많을 수 있어 시간초과를 받았다.

 

    static void DFS(int start, int sum, int dist){

        visit[start] = true;
        sum += dist;

        for(Edge e : list[start])
            if(!visit[e.tg])
                DFS(e.tg, sum, e.d);


        if(max < sum){
            maxVertex = start;
            max = sum;
        }
    }

# Code </>

public class Main {

    static class Edge{
        int tg, d;
        public Edge(int target, int dist){
            tg=target; d=dist;
        }
    }
    static final int N = 100001;
    static boolean[] visit;
    static List<Edge>[] list = new ArrayList[N];
    static int max, maxVertex;

    static void DFS(int start, int sum, int dist){

        visit[start] = true;
        sum += dist;

        for(Edge e : list[start])
            if(!visit[e.tg])
                DFS(e.tg, sum, e.d);

        if(max < sum){
            maxVertex = start;
            max = sum;
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int v = Integer.parseInt(br.readLine());

        for(int i=1; i<=v; i++)
            list[i] = new ArrayList<>();

        for(int i=0; i<v; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int home = Integer.parseInt(st.nextToken());

            while(true){
                int target = Integer.parseInt(st.nextToken());
                if(target == -1) break;
                int dist = Integer.parseInt(st.nextToken());

                list[home].add(new Edge(target, dist));
            }
        }

        visit = new boolean[N];
        max = 0;
        maxVertex = 0;
        DFS(1, 0, 0);

        visit = new boolean[N];
        max = 0;
        DFS(maxVertex, 0, 0);

        System.out.println(max);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 1774번 : 우주신과의 교감  (0) 2021.02.12
[백준] 2638번 : 치즈  (0) 2021.02.12
[백준] 16234번 : 인구 이동  (0) 2021.02.09
[백준] 1325번 : 효율적인 해킹  (0) 2021.02.09
[백준] 3055번 : 탈출  (0) 2021.02.08
Comments