Dijkstra Algorithm

1. ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ž€?

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

๋‹จ, ๋ชจ๋“  ๊ฐ„์„ ์˜ ๊ฐ€์ค‘์น˜๊ฐ€ 0 ๋˜๋Š” ์–‘์ˆ˜ ์—ฌ์•ผํ•จ. (์Œ์ˆ˜ ๊ฐ€์ค‘์น˜ X)

ํ•ต์‹ฌ ๊ฐœ๋…:

  • ๋งค๋ฒˆ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ ๋ฅผ ์„ ํƒํ•ด์„œ, ๊ทธ ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋” ์งง์€ ๊ฒฝ๋กœ๊ฐ€ ์žˆ๋Š”์ง€ ๊ฐฑ์‹  ํ•จ.

  • ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์˜ ์ผ์ข…(ํ•œ ๋ฒˆ ์„ ํƒํ•œ ๋…ธ๋“œ๋Š” ๋‹ค์‹œ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Œ)


2. ๋™์ž‘ ๋ฐฉ์‹(์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉ ๋ฒ„์ „)

  1. ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฑฐ๋ฆฌ ๋ฐฐ์—ด dist[] ๋ฅผ ์ดˆ๊ธฐํ™” (dist[start] = 0 , ๋‚˜๋จธ์ง€๋Š” INF )

  2. PriorityQueue ๋ฅผ ์ด์šฉํ•ด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋…ธ๋“œ๋ฅผ ๊ณ„์† ์„ ํƒ

  3. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฑฐ๋ฆฌ๋ฅผ ๊ฐฑ์‹ 

  4. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต


3. ์ž๋ฐ” ๊ตฌํ˜„ (์šฐ์„ ์ˆœ์œ„ ํ ๊ธฐ๋ฐ˜)

Class Edge implements Comparable<Edge> {
    int to, weight;
    Edge(int to, int weight) {
        this.to = to;
        this.weight = weight;
    }
    public int compareTo(Edge other) {
        return this.weight - other.weight;
    }
}

public void dijkstra(int start, List<List<Edge>> graph, int[] dist) {
    int n = graph.size();
    boolean[] visited = new boolean[n];
    Arrays.fill(dist, Integer.MAX_VALUE);
    dist[start] = 0;
    
    PriorityQueue<Edge> pq = new PriorityQueue<>();
    pq.offer(new Edge(start, 0));
    
    while(!pq.isEmpty()) {
        Edge current = pq.poll();
        int curNode = current.to;
        
        if(visited[curNode]) continue;
        visited[curNode] = true;
        
        for(Edge e : graph.get(curNode)) {
            int next = e.to;
            int cost = dist[curNode] + e.weight;
            if(cost < dist[next]) {
                dist[next] = cost;
                pq.offer(new Edge(next, cost));
            }
        }
    }
}

๊ทธ๋ž˜ํ”„ ์ค€๋น„(์ธ์ ‘ ๋ฆฌ์ŠคํŠธ)

List<List<Edge>> graph = new ArrayList<>();
for(int i = 0; i <= N; i++) {
    graph.add(new ArrayList<>());
}

graph.get(1).add(new Edge(2, 4));
graph.get(1).add(new Edge(3, 2));
graph.get(2).add(new Edge(3, 5));
// ๋“ฑ๋“ฑ ...

4. ์‹œ๊ฐ„ ๋ณต์žก๋„

๋ฒ„์ „
์‹œ๊ฐ„๋ณต์žก๋„
์„ค๋ช…

๋ฐฐ์—ด ์‚ฌ์šฉ

O(Vยฒ)

์ž‘์€ ์ •์  ์ˆ˜์—์„œ ์‚ฌ์šฉ (V โ‰ค 500)

์šฐ์„ ์ˆœ์œ„ ํ

O((V + E) log V)

๋ณดํ†ต์˜ Dijkstra ๊ตฌํ˜„

ํž™ + ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ

O(E log V)

ํฌ์†Œ ๊ทธ๋ž˜ํ”„์—์„œ ํšจ์œจ์ 


5. ์‚ฌ์šฉ ์กฐ๊ฑด ์ •๋ฆฌ

์กฐ๊ฑด
๊ฐ€๋Šฅ ์—ฌ๋ถ€

๊ฐ€์ค‘์น˜ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„

โœ…

์–‘์˜ ๊ฐ€์ค‘์น˜

โœ…

์Œ์˜ ๊ฐ€์ค‘์น˜

โŒ (Bellman-Ford ์‚ฌ์šฉ)

๋ฌด๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„

โœ…

๋ฐฉํ–ฅ ๊ทธ๋ž˜ํ”„

โœ…

์ตœ๋‹จ ๊ฒฝ๋กœ ์—ญ์ถ”์ 

โœ… (์ด์ „ ๋…ธ๋“œ ๋ฐฐ์—ด ํ™œ์šฉ)


6. ์˜ˆ์ œ - ๊ฐ„๋‹จํ•œ ์ž…๋ ฅ ์˜ˆ

๋ฌธ์ œ

  • ์ •์  ์ˆ˜: 6๊ฐœ

  • ๊ฐ„์„  :

1 โ†’ 2 (2)
1 โ†’ 3 (5)
2 โ†’ 3 (1)
2 โ†’ 4 (2)
3 โ†’ 4 (3)
  • ์‹œ์ž‘ ๋…ธ๋“œ : 1

์ถœ๋ ฅ(1์—์„œ ๊ฐ ์ •์ ๊นŒ์ง€ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ)

1๋ฒˆ: 0
2๋ฒˆ: 2
3๋ฒˆ: 3
4๋ฒˆ: 4

7. Dijkstra ๋กœ ์ž์ฃผ ๋‚˜์˜ค๋Š” ๋ฌธ์ œ ์œ ํ˜•

์œ ํ˜•
์„ค๋ช…

๊ธฐ๋ณธ ์ตœ๋‹จ ๊ฒฝ๋กœ

ํ•˜๋‚˜์˜ ์‹œ์ž‘์  โ†’ ๋ชจ๋“  ๋…ธ๋“œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ

๋„์ฐฉ์  ์ œํ•œ

์‹œ์ž‘ โ†’ ๋„์ฐฉ์  ํ•˜๋‚˜๋งŒ

๊ฒฝ๋กœ ์—ญ์ถ”์ 

์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฟ ์•„๋‹ˆ๋ผ, "์–ด๋–ป๊ฒŒ" ์ด๋™ํ–ˆ๋Š”์ง€๋„ ์ถœ๋ ฅ

๊ฒฝ์œ ์ง€ ํฌํ•จ

ํŠน์ • ์ •์ ์„ ๋ฐ˜๋“œ์‹œ ๋“ค๋Ÿฌ์•ผ ํ•จ (๊ฒฝ๋กœ A โ†’ B โ†’ C)

๊ฑฐ๋ฆฌ ์ œํ•œ

์ตœ๋‹จ ๊ฒฝ๋กœ๊ฐ€ ํŠน์ • ๊ฑฐ๋ฆฌ ์ดํ•˜์ธ ๊ฒฝ์šฐ๋งŒ ์œ ํšจ

2์ฐจ์› ๋งต ์ตœ๋‹จ ๊ฒฝ๋กœ

BFS๋ณด๋‹ค ์ •๋ฐ€ํ•œ ๊ฑฐ๋ฆฌ ๊ณ„์‚ฐ ํ•„์š”ํ•  ๋•Œ


8. ๊ด€๋ จ ์•Œ๊ณ ๋ฆฌ์ฆ˜

์•Œ๊ณ ๋ฆฌ์ฆ˜
์ฐจ์ด์ 

BFS

๋ชจ๋“  ๊ฐ„์„  ๊ฐ€์ค‘์น˜๊ฐ€ ๋™์ผํ•  ๋•Œ Dijkstra ๋Œ€์‹  ์‚ฌ์šฉ ๊ฐ€๋Šฅ (O(V + E))

Bellman-Ford

์Œ์ˆ˜ ๊ฐ€์ค‘์น˜ ํ—ˆ์šฉ, ๋А๋ฆผ

Floyd-Warshall

๋ชจ๋“  ์ •์  ๊ฐ„ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ (O(Nยณ)), ์ •์  ์ˆ˜ ์ ์„ ๋•Œ

A*

ํœด๋ฆฌ์Šคํ‹ฑ์„ ์‚ฌ์šฉํ•œ ์ตœ์ ํ™”๋œ ์ตœ๋‹จ ๊ฒฝ๋กœ ํƒ์ƒ‰ (๊ฒŒ์ž„, ๋„ค๋น„๊ฒŒ์ด์…˜ ๋“ฑ)


์š”์•ฝ

[Start]
   โ†“
 ์šฐ์„ ์ˆœ์œ„ ํ์—์„œ ๊ฐ€์žฅ ์ž‘์€ ๊ฑฐ๋ฆฌ ๋…ธ๋“œ ๊บผ๋ƒ„
   โ†“
  ์ธ์ ‘ ๋…ธ๋“œ ํ™•์ธ
   โ†“
  ๊ฑฐ๋ฆฌ ๊ฐฑ์‹  ์‹œ, ๋‹ค์‹œ ํ์— ๋„ฃ์Œ
   โ†“
  ๋ชจ๋“  ๋…ธ๋“œ ์ฒ˜๋ฆฌ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต

Last updated

Was this helpful?