최단거리 문제는 자주 나오지는 않지만 주요 기업에서 한번씩 나온다
최단 경로 알고리즘은 강장 짧은 경로를 찾는 알고리즘
BFS - 모든 간선의 비용이 동일할 때(단순 큐)
Dijkstra - 한지점에서 다른 모든 지점
Floyd Warshald - 모든 지점에서 다른 모든 지점
Bellman-Ford - 한 지점에서 다른 모든 지점 + 음의 간선
https://www.acmicpc.net/step/26
https://www.acmicpc.net/problem/11404 플로이드
https://www.acmicpc.net/problem/1753 최단 경로
https://www.acmicpc.net/problem/1162 도로포장
https://www.acmicpc.net/problem/1504 특정한 최단 경로
https://www.acmicpc.net/problem/9370 미확인 도착지
https://www.acmicpc.net/problem/5719 거의 최단 경로
https://www.acmicpc.net/problem/2325 개코전쟁
특정 노드에서 출발하여 다른 모든 노드로 가는 최단 경로를 계산
음의 간선이 없을 때 정상 작동 -> 음의 간선이 포함될 때는 Bellman-ford 알고리즘
다익스트라 최단 경로 알고리즘은 그리디 알고리즘으로 분류
- 매 상황에서 가장 비용이 적은 노드를 선택해 임의의 과정을 반복
인접 리스트 - 간선의 개수에 비례하는 메모리만 차지, ij가 연결되었는지 확인 여부 O(V), 연결된 모든 노드를 방문할 경우 O(V)보다 작거나 같다
인접 행렬 - 구현이 쉽다,ij가 연결되었는지 확인 여부 O(1) 시간 복잡도, 연결된 모든 노드를 방문할 경우 O(V)
void Dijkstra() {
//최단 거리 테이블 초기화
for (int i = 1; i <= V; i++) {
res[i] = INF;
}
priority_queue<pair<int,int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
//출발 노드 설정
pq.push({ 0,K });
res[K] = 0;
while (!pq.empty()) {
auto t = pq.top();
pq.pop();
int dist = t.first;
int now = t.second;
for (auto i : m[now]) {
int cost = dist + i.second;
int next = i.first;
if (cost < res[next]) {
res[next] = cost;
pq.push({ cost,next });
}
}
}
}
모든 노드에서 다른 모든 노드까지의 최단 경로를 모두 계산
다이나믹 프로그래밍 유형에 속함
인접 행렬을 이용
해당 점화식을 반복하여 이용하여 최단거리 계산
음수 간선이 포함된 상황에서 최단 거리 구하는 경우
기존의 알고리즘(Dijkstra, Floyd-warshall)의 경우 음수 간선을 적용하면 무한히 음수 순환을 지속한다.
음수 순환을 감지할 수 있다.
다익스트라 알고리즘에 비해 느리다.