알고리즘 공부

[백준 1240번] 노드사이의 거리 - java

철매존 2024. 12. 30. 15:04
728x90
반응형

문제 설명

1. N, M이 주어진다.

2. 1~N 의 숫자를 가진 애들이 N-1줄 주어지는데 두 점이랑 거리가 주어진다.

3. 그 다음에는 M개의 노드 쌍이 주어진다.

4. 3번 과정에 애들에 대해 거리를 출력하면 된다.

풀이 과정

1. DFS + 백트래킹

2. 랑 비슷하다.

3. 노드를 각자 가지고 있고 그 거리를 DFS로 갱신시키면서 봐주면 된다.

4. 그리고 현재 방문한 곳은 check해주고 다시 안보면 된다.

코드

/******************************************************************************

 Online Java Compiler.
 Code, Compile, Run and Debug java program online.
 Write your code in this editor and press "Run" button to execute it.

 *******************************************************************************/
import java.util.*;

public class Main {
    private static ArrayList<Info>[] nodes;
    private static boolean check[];
    private static int ans;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int N = sc.nextInt();
        int M = sc.nextInt();

        nodes = new ArrayList[N+1];
        for(int i=1; i<=N; i++) nodes[i] = new ArrayList<>();

        for(int i=1; i<N; i++) {
            int a = sc.nextInt();
            int b = sc.nextInt();
            int c = sc.nextInt();

            // a가 기준으로 b 로 가는 거리
            Info info = new Info(b, c);
            nodes[a].add(info);

            // b가 기준으로 a 로 가는 거리
            info = new Info(a, c);
            nodes[b].add(info);
        }

        for(int i=0; i<M; i++) {
            // 매번 초기화해주면서 확인한다.
            ans = Integer.MAX_VALUE;
            check = new boolean[N+1];
            int a = sc.nextInt();
            int b = sc.nextInt();
            DFS(a, b, 0);
            System.out.println(ans);
        }
    }

    private static void DFS(int now, int target, int move) {
        // 현재 노드를 기준으로
        ArrayList<Info> infoList = nodes[now];
        check[now] = true;

        for(Info info : infoList) {
            // 목적지와 거리를 가져온다.
            int des = info.destination;
            int dis = info.distance;

            // 이미 방문한 곳이면 패스
            if (check[des]) continue;

            // 목적지라면 그 거리를 체크해준다. 이미 목적지를 찾았으면 그 다음은 볼 필요가 없음
            if (des == target) {
                ans = Math.min(ans, move + dis);
                continue;
            }

            // 목적지가 아니라면 계속해서 탐색
            DFS(des, target, move + dis);
        }
    }
}

class Info {
    int destination;
    int distance;

    public Info(int destination, int distance) {
        this.destination = destination;
        this.distance = distance;
    }
}

 

반응형