[c++] 다익스트라 알고리즘(Dijkstra's Algorithm) 최단 경로 알고리즘

다익스트라 알고리즘 동작 방식

  1. 시작 정점을 선택하고 해당 정점까지의 최단 거리를 0으로 초기화합니다.
  2. 선택한 정점을 기준으로 인접한 정점들의 최단 거리를 갱신합니다.
  3. 방문하지 않은 정점 중 최단 거리를 갖는 정점을 선택하여 방문 처리합니다.
  4. 위 과정을 모든 정점을 방문할 때까지 반복합니다.
#include <iostream>
#include <vector>
#include <queue>
#include <climits>

using namespace std;

#define V 6

vector<pair<int, int>> adj[V]; // 인접 리스트

vector<int> dijkstra(int src) {
    vector<int> dist(V, INT_MAX);  // 최단 거리를 저장할 배열
    priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;  // 우선순위 큐

    dist[src] = 0;
    pq.push({0, src});

    while (!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        for (auto i : adj[u]) {
            int v = i.first;
            int weight = i.second;
            if (dist[v] > dist[u] + weight) {
                dist[v] = dist[u] + weight;
                pq.push({dist[v], v});
            }
        }
    }

    return dist;
}

int main() {
    adj[0].push_back({1, 5});
    adj[0].push_back({2, 1});
    adj[1].push_back({3, 3});
    adj[1].push_back({4, 7});
    adj[2].push_back({4, 5});
    adj[2].push_back({5, 2});
    adj[3].push_back({4, 1});
    adj[4].push_back({5, 3});

    vector<int> dist = dijkstra(0);
    for (int i = 0; i < V; i++) {
        cout << "Vertex " << i << ", Distance: " << dist[i] << endl;
    }
    return 0;
}

위 코드는 입력된 그래프에서 정점 0부터 다른 모든 정점까지의 최단 거리를 계산하는 다익스트라 알고리즘의 예시입니다.

Dijkstra 알고리즘을 이용하여 최단 경로를 구할 수 있으며, 이로써 네트워크 라우팅, GPS, 인공 지능, 휴리스틱 검색 등에서 많이 활용되고 있습니다. 하지만, 이 알고리즘은 음수 가중치가 있을 경우에는 사용할 수 없다는 한계가 있습니다.