코딩테스트/Java

[JAVA] 백준 그대, 그머가 되어

SK_MOUSE 2022. 2. 25. 00:29
반응형

BFS 아니고, 다익스트라 알고리즘 문제이다. 

 

두 알고리즘 용도가 헷갈렸는데, 아래 정리해보았다.

BFS탐색: 시작점으로부터 어떤 정점까지 너비우선적으로 탐색한다. 최단경로를 구할 때 사용할 수도 있다.
다익스트라: 시작점으로부터 나머지 모든 정점까지의 최단경로를 구할 때 사용

 

다익스트라 위 문제에서는 아래 코드가 키 포인트다.

 
 static final int INF = 1000000000;
 static List<Integer>[] list = new ArrayList[1001];//리스트 배열
 static int[] dist = new int[1001];
    
 private static void dijkstra(int start) {

        Queue<Node> pq = new PriorityQueue<>((a, b) -> a.dist - b.dist);
        dist[start] = 0;
        pq.add(new Node(start, 0));

        while (!pq.isEmpty()) {
            Node n = pq.poll();
            int cur = n.end;
            int d = n.dist;

            if (dist[cur] < d) continue;

            for (int next : list[cur]) {//모든 연결노드로 갱신
                if (dist[next] > d + 1) {//"현재 거리 > 한칸 전진한값" 일때 갱신
                    dist[next] = d + 1;
                    pq.add(new Node(next, d + 1));
                }
            }
        }
    }

 

아래는 다익스트라로 각각의 정점에 대하여 최단경로를 갱신하면 되는 문제이므로 아래 코드를 남기겠다.

import java.io.*;
import java.util.*;

public class Main {
    static int a, b, N, M;
    static final int INF = 1000000000;
    static List<Integer>[] list = new ArrayList[1001];
    static int[] dist = new int[1001];

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        a = Integer.parseInt(st.nextToken());
        b = Integer.parseInt(st.nextToken());
        st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        for (int i = 1; i <= N; i++) {
            list[i] = new ArrayList<>();
            dist[i] = INF;
        }


        for (int i = 0; i <= M - 1; i++) {
            st = new StringTokenizer(br.readLine());

            int h = Integer.parseInt(st.nextToken());
            int tg = Integer.parseInt(st.nextToken());

            list[h].add(tg);
            list[tg].add(h);
        }

        dijkstra(a);

        System.out.println(dist[b] == INF ? -1 : dist[b]);
    }

    private static void dijkstra(int start) {

        Queue<Node> pq = new PriorityQueue<>((a, b) -> a.dist - b.dist);
        dist[start] = 0;
        pq.add(new Node(start, 0));

        while (!pq.isEmpty()) {
            Node n = pq.poll();
            int cur = n.end;
            int d = n.dist;

            if (dist[cur] < d) continue;

            for (int next : list[cur]) {
                if (dist[next] > d + 1) {
                    dist[next] = d + 1;
                    pq.add(new Node(next, d + 1));
                }
            }
        }
    }

    static class Node {
        int end, dist;

        public Node(int end, int dist) {
            this.end = end;
            this.dist = dist;
        }
    }
}

 

 

반응형

'코딩테스트 > Java' 카테고리의 다른 글

[JAVA] 수들의 합5  (0) 2022.03.10
[JAVA] 백준 적록색약  (0) 2022.02.26
[JAVA] 백준 끝나지 않는 파티(플로이드워셜)  (0) 2022.02.14
[JAVA] 백준 수강신청  (0) 2022.02.09
[JAVA] 백준 감소하는 수  (0) 2022.02.06