ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]19542: 전단지 돌리기(java)
    Algorithm/백준 2022. 6. 4. 21:34
    728x90

    https://www.acmicpc.net/problem/19542

     

    19542번: 전단지 돌리기

    현민이는 트리 모양의 길 위에서 오토바이를 타고 전단지를 돌리려고 한다. 현민이의 목표는 케니소프트에서 출발하여 모든 노드에 전단지를 돌리고, 다시 케니소프트로 돌아오는 것이다. 현민

    www.acmicpc.net

    문제

    현민이는 트리 모양의 길 위에서 오토바이를 타고 전단지를 돌리려고 한다. 현민이의 목표는 케니소프트에서 출발하여 모든 노드에 전단지를 돌리고, 다시 케니소프트로 돌아오는 것이다. 현민이는 힘이 좋기 때문에 현재 노드에서 거리가 D 이하인 모든 노드에 전단지를 돌릴 수 있다.

    날씨가 매우 덥기 때문에, 현민이는 최소한만 이동해서 목표를 달성하고 싶다! 현민이를 위해 현민이가 이동해야 하는 총 거리를 구해주자.

    입력

    첫번째 줄에는 노드의 개수 N(1≤N≤100 000)과 케니소프트의 위치 S(1≤S≤N), 힘 D(0≤D≤N)이 주어진다.

    두 번째 줄부터 N번째 줄까지, 트리의 간선 정보를 의미하는 두 자연수 x, y가 공백으로 구분되어 주어진다. 이는 x번 노드와 y번 노드가 연결되어 있음을 의미한다. (1≤x,y≤N, x≠y)

    주어지는 연결관계는 트리를 구성하며, 모든 간선의 길이는 1이다.

    출력

    현민이가 목표를 완수하기 위해 이동해야 하는 최소 거리를 출력하여라.

    예제 입력 1 

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

    예제 출력 1 

    6
    

     


    풀이

    전체코드

    package 백준;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.StringTokenizer;
    
    public class BJ_G4_19542_전단지돌리기 {
        static ArrayList<Integer>[] graph;
        static int N, S, D;
        static int[] depth;
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
    
            N = Integer.parseInt(st.nextToken());
            S = Integer.parseInt(st.nextToken());
            D = Integer.parseInt(st.nextToken());
            graph = new ArrayList[N+1];
            depth = new int[N+1];
            for(int i=1; i<=N; i++) {
                graph[i] = new ArrayList<>();
            }
    
            for(int i=0; i<N-1; i++) {
                st = new StringTokenizer(br.readLine());
                int s = Integer.parseInt(st.nextToken());
                int e = Integer.parseInt(st.nextToken());
    
                graph[s].add(e);
                graph[e].add(s);
            }
            getChildrenCnt(S, 0);
    
            int cnt = 0;
            for (int i = 1; i <= N; i++) {
                if (depth[i] >= D && i != S) {
                    cnt++;
                }
            }
            System.out.printf("%d", cnt*2);
        }
    
        public static int getChildrenCnt(int now, int before) {
            int max = 0;
            for (int next : graph[now]) {
                if(next == before) continue;
                max = Math.max(max, getChildrenCnt(next, now) + 1);
            }
            depth[now] = max;
            return max;
        }
    }
    
    728x90

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

    [백준]1719: 택배(java)  (0) 2022.06.14
    [백준]13265: 색칠하기(java)  (0) 2022.06.05
    [백준]1477: 휴게소 세우기(java)  (0) 2022.06.01
    [백준]1826: 연료 채우기(java)  (0) 2022.05.31
    [백준]2026: 소풍(java)  (0) 2022.05.30

    댓글

Designed by Tistory.