CS 101
[DP] Dijkstra 다익스트라 알고리즘
yungommi
2023. 6. 1. 21:33
반응형
가중치가 모두 양수일때만 사용 가능
다익스트라(dijkstra) 알고리즘은 그래프에서 한 정점(노드)에서 다른 정점까지의 최단 경로를 구하는 알고리즘 중 하나이다. 이 과정에서 도착 정점 뿐만 아니라 모든 다른 정점까지 최단 경로로 방문하며 각 정점까지의 최단 경로를 모두 찾게 된다. 매번 최단 경로의 정점을 선택해 탐색을 반복하는 것이다.
참고로 그래프 알고리즘 중 최소 비용을 구하는 데는 다익스트라 알고리즘 외에도 벨만-포드 알고리즘, 프로이드 워샬 알고리즘 등이 있다.
1. 출발 노드와 도착 노드를 설정한다.
2. '최단 거리 테이블'을 초기화한다.
3. 현재 위치한 노드의 인접 노드 중 방문하지 않은 노드를 구별하고, 방문하지 않은 노드 중 거리가 가장 짧은 노드를 선택한다. 그 노드를 방문 처리한다.
4. 해당 노드를 거쳐 다른 노드로 넘어가는 간선 비용(가중치)을 계산해 '최단 거리 테이블'을 업데이트한다.
5. 3~4의 과정을 반복한다.
동작예시
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
# define INF 99999999
// 시작 위치와 정점의 개수, 인접 행렬을 받아
// 최소 거리 행렬을 반환함
vector<int> dijkstra(int start, int N, vector<pair<int, int>> graph[])
{
vector<int> dist(N, INF); // 거리를 저장할 리스트 초기화
priority_queue<pair<int, int>> pq; // 우선순위 큐 선언
dist[start] = 0; // 시작 노드 거리를 0으로 함
pq.push({ 0, start }); // 우선순위 큐에 넣기
while (!pq.empty())
{
int cur_dist = -pq.top().first; // 큐에서 꺼내 방문하고 있는 정점의 거리
int cur_node = pq.top().second; // 정점의 인덱스(번호)
pq.pop();
for (int i = 0; i < graph[cur_node].size(); i++)
{
int nxt_node = graph[cur_node][i].first; // 인접 정점 번호
int nxt_dist = cur_dist + graph[cur_node][i].second; // 인접 정점까지 거리
if (nxt_dist < dist[nxt_node]) // 지금 계산한 것이 기존 거리값보다 작다면
{
dist[nxt_node] = nxt_dist; // 거리값 업데이트
pq.push({ -nxt_dist, nxt_node }); // 우선순위 큐에 넣기
}
}
}
return dist; // start 노드로부터 각 노드까지 최단거리를 담은 벡터 리턴
}
int main()
{
const int N = 10; // 노드의 개수가 10개라 가정.
int E = 20; // 간선의 개수가 20개라 가정.
vector<pair<int, int>> graph[N]; // 그래프 형태 선언
for (int i = 0; i < E; i++)
{
int from, to, cost; // 간선의 시작점, 끝점, 가중치
cin >> from >> to >> cost;
graph[from].push_back({ to, cost }); // 무향 그래프라 가정하므로 시작점과 끝점 둘 다 벡터에 넣어야 함
graph[to].push_back({ from, cost });
}
vector<int> dist = dijkstra(0, N, graph);
cout << "끝점까지의 최단거리" << dist[N - 1] << endl;
return 0;
}
간선의 수 E, 노드의 수 V => O(E log V)
우선순위 큐에서 꺼낸 노드는 연결된 노드만 탐색하므로 최악의 경우라도 총 간선 수인 E만큼만 반복한다. 즉 하나의 간선에 대해서는 이고, E는 보다 항상 작기 때문에 E개의 간선을 우선순위 큐에 넣었다 빼는 최악의 경우에 대해서는 이다.
반응형