์ •์˜

  • ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ํ•œ ์ •์ ์œผ๋กœ๋ถ€ํ„ฐ ๋‹ค๋ฅธ ๋ชจ๋“  ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

ํŠน์ง•

  • ์Œ์ˆ˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๊ฐ€๋Šฅ
  • ๋งค๋ฒˆ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ์ธ ์ •์  ์„ ํƒ
  • ์šฐ์„ ์ˆ˜์œ„ ํ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์‹œ๊ฐ„๋ณต์žก๋„๋Š” O(E logV)

์ฝ”๋“œ

๊ตฌํ˜„

public void dijkstra() {
    Queue<Node> queue = new PriorityQueue<>();
    queue.add(new Node(start, 0));
    dist[start] = 0;

    while (!queue.isEmpty()) {
        Node cur = queue.poll();

        if (dist[cur.v] < cur.w) {
            continue;
        }

        for (Node next : graph.get(cur.v)) {
            if (dist[next.v] > dist[cur.v] + next.w) {
                dist[next.v] = dist[cur.v] + next.w;
                queue.add(new Node(next.v, dist[next.v]));
            }
        }
    }
}

public class Node implements Comparable<Node> {
    int v;
    int w;

    public Node(int v, int w) {
        this.v = v;
        this.w = w;
    }

    @Override
    public int compareTo(Node o) {
        return this.w - o.w;
    }
}

๊ฒฝ๋กœ ์ถ”์ 

public void dijkstra() {
    Queue<Node> queue = new PriorityQueue<>();
    queue.add(new Node(start, 0));
    int[] prev = new int[n + 1];
    dist[start] = 0;

    while (!queue.isEmpty()) {
        Node cur = queue.poll();

        if (dist[cur.v] < cur.w) {
            continue;
        }

        for (Node next : graph.get(cur.v)) {
            if (dist[next.v] > dist[cur.v] + next.w) {
                dist[next.v] = dist[cur.v] + next.w;
                prev[next.v] = cur.v;
                queue.add(new Node(next.v, dist[next.v]));
            }
        }
    }
}

public class Node implements Comparable<Node> {
    int v;
    int w;

    public Node(int v, int w) {
        this.v = v;
        this.w = w;
    }

    @Override
    public int compareTo(Node o) {
        return this.w - o.w;
    }
}

ํŠน์ • ์ •์ ์„ ๋ฐ˜๋“œ์‹œ ํ†ต๊ณผํ•˜๋Š” ์ตœ๋‹จ ๊ฒฝ๋กœ

public void solve() {
    int[] d1 = dijkstra(1);
    int[] d2 = dijkstra(v1);
    int[] d3 = dijkstra(v2);
}

public int[] dijkstra(int start) {
    Queue<Node> queue = new PriorityQueue<>();
    queue.add(new Node(start, 0));
    int[] dist = new int[N + 1];
    Arrays.fill(dist, 987654321);
    dist[start] = 0;

    while (!queue.isEmpty()) {
        Node cur = queue.poll();

        if (dist[cur.v] < cur.w) {
            continue;
        }

        for (Node next : graph.get(cur.v)) {
            if (dist[next.v] > dist[cur.v] + next.w) {
                dist[next.v] = dist[cur.v] + next.w;
                queue.add(new Node(next.v, dist[next.v]));
            }
        }
    }

    return dist;
}

public class Node implements Comparable<Node> {
    int v;
    int w;

    public Node(int v, int w) {
        this.v = v;
        this.w = w;
    }

    @Override
    public int compareTo(Node o) {
        return this.w - o.w;
    }
}