์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜

์ตœ๋‹จ ๊ฒฝ๋กœ๋ž€?

๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ๋‘ ์ •์  ์‚ฌ์ด ๊ฒฝ๋กœ๋“ค ์ค‘ ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ๊ฒฝ๋กœ

ํ•˜๋‚˜์˜ ์‹œ์ž‘ ์ •์ ์—์„œ ๋ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฒจ๋งŒ-ํฌ๋“œ(Bellman-Ford) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์Œ

๋ชจ๋“  ์ •์ ๋“ค์— ๋Œ€ํ•œ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ๋Š” ํ”Œ๋กœ์ด๋“œ-์›Œ์ƒฌ(Floyd-Warshall) ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์žˆ์Œ

  • ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ทธ๋ž˜ํ”„์˜ ํƒ์ƒ‰์œผ๋กœ๋Š” DFS, BFS ๋ฐฉ๋ฒ•์ด ์กด์žฌํ•œ๋‹ค.
  • ๊ทธ ์ค‘ ๋‘ ์ •์  ์‚ฌ์ด ๊ฒฝ๋กœ ์ค‘ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” BFS๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๊ฐ€์ค‘์น˜๊ฐ€ ์—†๋Š” ๊ทธ๋ž˜ํ”„์—์„œ ์ตœ๋‹จ๊ฒฝ๋กœ๋Š” ๋‹ค์‹œ ๋งํ•ด ์ตœ์†Œ ๊ฐ„์„  ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๊ธฐ ๋•Œ๋ฌธ!

๋‹ค์ต์ŠคํŠธ๋ผ(Dijkstra) ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ์‹œ์ž‘ ์ •์ ์—์„œ ๊ฐ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด๋‚˜๊ฐ€๋ฉฐ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๋„์ถœ
  • ํƒ์š•(๊ทธ๋ฆฌ๋””) ์•Œ๊ณ ๋ฆฌ์ฆ˜ - ์ถœ๋ฐœ์ง€์—์„œ ํ•œ๋ฒˆ ๊ฒฝ์œ ์ง€๊ฐ€ ์„ ํƒ๋˜๋ฉด ํ•ด๋‹น ๊ฒฝ์œ ์ง€๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๋„์ถœ๋œ ๊ฒƒ์œผ๋กœ ๋ด„. ๋”ฐ๋ผ์„œ ์ด๋ฏธ ๊ฒฝ์œ ์ง€๋กœ ์„ ํƒ๋œ ์ •์ ์€ ๊ฒฝ๋กœ๋ฅผ ๋‹ค์‹œ ๋˜๋Œ์•„๋ณด์ง€ ์•Š์Œ
  • ์ถœ๋ฐœ์ง€์—์„œ ๋„์ฐฉ์ง€๊นŒ์ง€ ์ง์ ‘ ๋น„์šฉ, ๊ฒฝ์œ  ๋น„์šฉ ๋ชจ๋‘ ๋น„๊ตํ•ด ์ตœ์†Œ์ธ ๊ฒฝ๋กœ๊ฐ€ ์ฑ„ํƒ๋จ
  • ๋”ฐ๋ผ์„œ ๊ฐ„์„  ๊ฐœ์ˆ˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋„์ฐฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐ„์„  ๊ฐ€์ค‘์น˜๋ฅผ ์ตœ์†Œํ™”ํ•˜์—ฌ ๋„์ฐฉํ•˜๊ฒŒ ๋จ
  • ์Œ์˜ ๊ฐ€์ค‘์น˜๋Š” ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ(๋ฒจ๋งŒ-ํฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์˜ ๊ฐ€์ค‘์น˜๋„ ํ—ˆ์šฉํ•จ)
  • O(N^3)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ

๋กœ์ง ๐Ÿ’ก

  1. ์‹œ์ž‘ ์ •์ ์—์„œ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์  ์ค‘ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ์„ ๋ฐฉ๋ฌธํ•˜๊ณ , ์ด๋ฅผ ๊ฒฝ์œ ์ง€๋กœ ์ฑ„ํƒ
  2. ๊ฒฝ์œ ์ง€๊ฐ€ ์„ ํƒ๋๋‹ค๋ฉด ๊ฒฝ์œ ์ง€์—์„œ ์ธ์ ‘ํ•˜๊ณ  ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์  ์ค‘, ํ˜„์žฌ ์ฑ„ํƒ๋œ ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ์„œ ๋„์ฐฉํ•˜๋ฉด ๋” ๋นจ๋ฆฌ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๋Š” ์ •์ ์— ๋Œ€ํ•ด ์ตœ๋‹จ ๊ฒฝ๋กœ ์—…๋ฐ์ดํŠธ
Java
public void Dijkstra {
    int V;                 // ์ •์  ๊ฐœ์ˆ˜
    int[][] adjMatrix;     // ์ธ์ ‘ํ•œ ์ •์  ๊ฐ„ ๊ฐ€์ค‘์น˜ ์ €์žฅํ•œ ๋ฐฐ์—ด
    int[] distance;        // start ์—์„œ ์ž์‹ ์œผ๋กœ ์˜ค๋Š” ์ตœ์†Œ ๋น„์šฉ, S~v (๋‹ค๋ฅธ ์ •์ ์„ ์—ฌ๋Ÿฌ๊ฐœ ๊ฑฐ์น  ์ˆ˜๋„, ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ)
    boolean[] visited;     // ๊ฒฝ์œ ์ง€๋กœ ๊ณ ๋ คํ•ด๋ณธ ์ •์ ์ธ์ง€๋ฅผ ์ €์žฅ
    int start, end;        // ์‹œ์ž‘์ •์ ๊ณผ ๋„์ฐฉ์ •์ 

    distance[start] = 0;   // ์ถœ๋ฐœ์ง€์—์„œ ์ถœ๋ฐœ์ง€๊นŒ์ง€ ๊ฑฐ๋ฆฌ 0์œผ๋กœ ์ดˆ๊ธฐํ™”

    // ์ •์  ๊ฐœ์ˆ˜๋งŒํผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ์ •์  ๋ณ„ ์ตœ๋‹จ๊ฑฐ๋ฆฌ ์ฑ„์›Œ๊ฐ
    for (int i=0; i<V; i++) {
        // 1) ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์  ์ค‘, ์ถœ๋ฐœ์ง€๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ์„ ๊ฒฝ์œ ์ง€๋กœ ์„ ํƒ
        int min = Integer.MAX_VALUE;
        int stopOver = 0;

        for (int j=0; j<V; j++) {
            if (!visited[j] && distance[j] < min) {     // distance ๋ฐฐ์—ด์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ฐพ๊ธฐ
                min = distance[j];
                stopOver = j;         // ๊ฒฝ์œ ์ง€๋กœ ์„ ํƒ
            }
        }
        visited[stopOver] = true;

        // 2) ์œ„์—์„œ ์„ ํƒ๋œ ๊ฒฝ์œ ์ง€์˜ ์ธ์ ‘ํ•œ ์ •์  ์ค‘, ํ•ด๋‹น ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ์„œ ๊ฐ€๋ฉด ๋” ์ตœ๋‹จ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ
        for (int j=0; j<V; j++) {
            if (!visited[j] && min+adjMatrix[stopOver][j] != 0 && min+adjMatrix[stopOver][j] < distance[j]) {      // ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ณ , ๊ฒฝ์œ ์ง€์™€ ์ธ์ ‘ํ•˜๋ฉฐ, ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด ๋” ๋นจ๋ฆฌ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด
                distance[j] = min+adjMatrix[stopOver][j];     // ์ตœ๋‹จ ๊ฒฝ๋กœ ๊ฐฑ์‹ 
            }
        }
    }
    System.out.println(distance[end]);        // ์ตœ์ข… ๋„์ฐฉ์ง€๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ์ถœ๋ ฅ
}

์‘์šฉ

๊ฒฝ๋กœ ์ฐ์–ด๋ณด๊ธฐ

  • ํŠน์ • ์ •์ ์˜ distance ๋ฐฐ์—ด์„ ์—…๋ฐ์ดํŠธํ•œ ๊ฒฝ์œ ์ง€๊ฐ€ ์ง์ „ ์ •์ ์ด ๋จ. ๋”ฐ๋ผ์„œ ์ง์ „ ์ •์ ์„ ๊ธฐ์–ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„
  • stack ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์ด์šฉํ•˜๊ฑฐ๋‚˜ StringBuilder์— ์ฐจ๊ณก์ฐจ๊ณก ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ

์ตœ์ ํ™”

  1. ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ์ตœ์ ํ™”

    • ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ํ–‰๋ ฌ๋กœ ํ‘œํ˜„ํ•  ๊ฒฝ์šฐ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” O(2V^2)๋ฒˆ
    • ๊ทธ๋ž˜ํ”„๋ฅผ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋กœ ํ‘œํ˜„ํ•  ๊ฒฝ์šฐ ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” O(V^2 + E)๋ฒˆ
    • ๋”ฐ๋ผ์„œ ๋ณ„๋„์˜ ์ตœ์ ํ™” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์—†์ด๋„ ๊ฐ„์„ ์˜ ํฌ๊ธฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํšจ์œจ์ ์ž„
    • ๋‹จ, ์™„์ „ ๊ทธ๋ž˜ํ”„์˜ ๊ฒฝ์šฐ์—๋Š” E๊ฐ€ ๊ฑฐ์˜ V^2์— ๊ฐ€๊นŒ์›Œ ์ง€๋ฏ€๋กœ(์ •ํ™•ํ•˜๊ฒŒ๋Š” V(V-1)/2) ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋‚˜ ์ธ์ ‘ ํ–‰๋ ฌ์ด๋‚˜ ๋น„์Šทํ•ด์ง
    • ๊ฐ„์„ ์ด ๋งŽ์ง€ ์•Š์„ ๋•Œ ์œ ๋ฆฌํ•จ!

  1. ์šฐ์„ ์ˆœ์œ„ ํ(์ตœ์†Œํž™)๋ฅผ ์ด์šฉํ•œ ์ตœ์ ํ™”

    • ๋‹ค์ต์ŠคํŠธ๋ผ ๋กœ์ง ์ค‘ 2๋ฒˆ ๋กœ์ง์˜ ๊ฒฝ์šฐ ์ตœ์ ํ™”๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•˜์ง€๋งŒ 1๋ฒˆ ๋กœ์ง์€ ์šฐ์„ ์ˆœ์œ„ ํ๋ฅผ ์ด์šฉํ•ด ๊ฐœ์„  ๊ฐ€๋Šฅํ•จ
    • 2)๋ฒˆ ๋กœ์ง์—์„œ ์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ๊ฐฑ์‹ ๋œ ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด(์ •์ ๊ณผ ๊ฐ€์ค‘์น˜)๋ฅผ ์šฐ์„ ์ˆœ์œ„ ํ์— ์‚ฝ์ž… -> ์ž์ฒด์ ์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ๋œ ์ƒํƒœ๋กœ ์œ ์ง€
    • 1)๋ฒˆ ๋กœ์ง์—์„œ๋Š” ์ถœ๋ฐœ์ง€๋กœ๋ถ€ํ„ฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์  ์ค‘ ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ poll()ํ•˜์—ฌ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ •์ ์„ ๊ฒฝ์œ ์ง€๋กœ ์„ ํƒํ•œ๋‹ค๋ฉด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๊ฒฝ์œ ์ง€๋ฅผ ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Œ!!
    • 1)๋ฒˆ ๋กœ์ง ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” ๋Œ€๋žต VlogV, 2๋ฒˆ ๋กœ์ง ์—ฐ์‚ฐ ํšŸ์ˆ˜๋Š” ๋Œ€๋žต ElogV์ด๋ฏ€๋กœ ์ด (V+E)logV๋ฒˆ์˜ ์—ฐ์‚ฐ๋งŒ ์ˆ˜ํ–‰๋จ
    • ํ•˜์ง€๋งŒ ์ด ์—ญ์‹œ ์™„์ „ ๊ทธ๋ž˜ํ”„์˜ ์ €์ฃผ๋Š” ํ”ผํ•  ์ˆ˜ ์—†๋Š”๋ฐ, ์™„์ „ ๊ทธ๋ž˜ํ”„์—์„œ์˜ ์—ฐ์‚ฐ์€ (V+V^2)logV๋ฒˆ ์ˆ˜ํ–‰๋˜๋ฏ€๋กœ ์ตœ์ ํ™”๋ฅผ ํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋ž‘ ๋น„์Šทํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.
๐Ÿ‘€ ์ตœ์†Œํž™
  • ์™„์ „ ์ด์ง„ ํŠธ๋ฆฌ
  • ํŠธ๋ฆฌ์˜ ๋งจ ๋’ท๋‹จ์— ์›์†Œ๋ฅผ ์‚ฝ์ž…ํ•  ๊ฒฝ์šฐ ์ž์‹ ๋…ธ๋“œ๋Š” ์กฐ์ƒ ๋…ธ๋“œ์™€ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์Œ
  • ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ ์›์†Œ๋ฅผ ์‚ญ์ œํ•  ๊ฒฝ์šฐ ๋งจ ๋’ท๋‹จ์˜ ์›์†Œ๊ฐ€ ๋ฃจํŠธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•œ ๋’ค, ์ž์† ๋…ธ๋“œ์™€ ๋น„๊ตํ•ด๊ฐ€๋ฉฐ ์ž์‹ ์˜ ์œ„์น˜๋ฅผ ์ฐพ์Œ
  • ๊ฐ’์„ ์‚ฝ์ž…ํ•˜๊ณ  ์‚ญ์ œํ•  ๋•Œ ์˜ค์ง logN๋ฒˆ์˜ ์—ฐ์‚ฐ๋งŒ ์†Œ์š”๋จ -> ๋งค์šฐ ํšจ์œจ์ !
Java
public class Dijkstra_PQ {
    class Vertex implements Comparable {
        int no, distance;

        public Vertex(int no, int distance) {
			super();
			this.no = no;
			this.distance = distance;
		}

		@Override
		public int compareTo(Vertex o) {
			return this.distance - o.distance;
		}
    }

    public void Dijkstra {
    int V;                 // ์ •์  ๊ฐœ์ˆ˜
    int[][] adjMatrix;     // ์ธ์ ‘ํ•œ ์ •์  ๊ฐ„ ๊ฐ€์ค‘์น˜ ์ €์žฅํ•œ ๋ฐฐ์—ด
    int distance;          // start ์—์„œ ์ž์‹ ์œผ๋กœ ์˜ค๋Š” ์ตœ์†Œ ๋น„์šฉ, S~v (๋‹ค๋ฅธ ์ •์ ์„ ์—ฌ๋Ÿฌ๊ฐœ ๊ฑฐ์น  ์ˆ˜๋„, ์•„๋‹ ์ˆ˜๋„ ์žˆ์Œ)
    boolean[] visited;     // ๊ฒฝ์œ ์ง€๋กœ ๊ณ ๋ คํ•ด๋ณธ ์ •์ ์ธ์ง€๋ฅผ ์ €์žฅ
    int start, end;        // ์‹œ์ž‘์ •์ ๊ณผ ๋„์ฐฉ์ •์ 

    distance[start] = 0;   // ์ถœ๋ฐœ์ง€์—์„œ ์ถœ๋ฐœ์ง€๊นŒ์ง€ ๊ฑฐ๋ฆฌ 0์œผ๋กœ ์ดˆ๊ธฐํ™”
    PriorityQueue<Vertex> pq = newPriorityQueue<>();
    pq.offer(new Vertex(start, distance[start]));    // ์ตœ์ดˆ์—๋Š” ์ถœ๋ฐœ์ง€๋ฅผ ํ์— ์‚ฝ์ž…

    while(!pq.isEmpty()) {
        // 1) ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ •์  ์ค‘, ์ถœ๋ฐœ์ง€๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์ •์ ์„ ๊ฒฝ์œ ์ง€๋กœ ์„ ํƒ
        Vertex stopOver = pq.poll();           // ์šฐ์„ ์ˆœ์œ„ ํ ๋•๋ถ„์— ์ž๋™์ ์œผ๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •์  ๊ตฌํ•จ

        if (visited[stopOver.no]) continue;    // ๋‹จ, ๋ฐฉ๋ฌธํ–ˆ์œผ๋ฉด pass

        visited[stopOver.no] = true;

        if (stopOver.no == end) break;         // ๋„์ฐฉ์ง€์— ๋„์ฐฉํ•˜๋ฉด ํƒˆ์ถœ

        // 2) ์œ„์—์„œ ์„ ํƒ๋œ ๊ฒฝ์œ ์ง€์˜ ์ธ์ ‘ํ•œ ์ •์  ์ค‘, ํ•ด๋‹น ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ์„œ ๊ฐ€๋ฉด ๋” ์ตœ๋‹จ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ
        for (int j=0; j<V; k++) {
            if (!visited[j] && adjMatrix[stopOver.no][j] && stopOver.distance+adjMatrix[stopOver.no][j] < distance[j]) {     // ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๊ณ , ๊ฒฝ์œ ์ง€์™€ ์ธ์ ‘ํ•˜๋ฉฐ, ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ๊ฐ€๋ฉด ๋” ๋นจ๋ฆฌ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉด
                distance[j] = stopOver.distance + adjMatrix[stopOver.no][j];     // ์ถœ๋ฐœ์ง€์—์„œ๋ถ€ํ„ฐ ๊ฒฝ์œ ์ง€๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ์™€ ๊ฒฝ์œ ์ง€๋กœ๋ถ€ํ„ฐ ์ธ์ ‘ํ•œ ์ •์ ๊นŒ์ง€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ๋”ํ•œ ๊ฐ’(๊ฒฝ์œ  ๋น„์šฉ)์œผ๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๊ฐฑ์‹ 
                pq.offer(new Vertex(j, distance[j]));      // ์—…๋ฐ์ดํŠธ ๋œ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋Š” ํ์— ์‚ฝ์ž…
            }
        }
    }
    System.out.println(distance[end]);        // ์ตœ์ข… ๋„์ฐฉ์ง€๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ ์ถœ๋ ฅ
}

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ Vs ํ”„๋ฆผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ๋‹ค์ต์ŠคํŠธ๋ผ : ํŠน์ • ์‹œ์ž‘ ์ •์ ์—์„œ ํŠน์ • ๋„์ฐฉ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ

    • ์‹œ์ž‘ ์ •์ ์—์„œ ๊ฒฝ์œ ์ง€๋ฅผ ๊ฑฐ์ณ(ํ˜น์€ ๊ฑฐ์น˜์ง€ ์•Š๋”๋ผ๋„) ๋„์ฐฉ ์ •์ ๊นŒ์ง€ ๋„๋‹ฌํ•˜๊ธฐ๊นŒ์ง€ ๊ฑฐ์ณ์˜จ ๊ฒฝ๋กœ ๋น„์šฉ์„ ๋ชจ๋‘ ๋”ํ•œ ๊ฒƒ์ด ์ตœ์†Œ์ธ ๊ฒฝ์šฐ๊ฐ€ ๋„์ฐฉ์ง€๊นŒ์ง€์˜ ์ตœ๋‹จ๊ฒฝ๋กœ
  • ํ”„๋ฆผ : ์ž„์˜์˜ ์‹œ์ž‘ ์ •์ ์—์„œ ๋ชจ๋“  ์ •์ ์„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฐ„์„ ์˜ ์ตœ์†Œ ๋น„์šฉ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ

    • ๋ชจ๋“  ์ •์ ์ด ํ•˜๋‚˜๋กœ ์—ฐ๊ฒฐ๋˜์–ด์•ผ ํ•จ
    • ๊ฐ ๋‹จ๊ณ„ ๋ณ„ ๋„์ฐฉ ์ •์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๋น„์šฉ์„ ๋ˆ„์ ํ•ฉํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋ƒฅ ํ˜„์žฌ ๊ฐ„์„  ๋น„์šฉ๋งŒ์„ ๋น„์šฉ์œผ๋กœ ๊ณ„์‚ฐ