그래프가 주어졌을 때 시작 노드에서부터 종료 시점까지 최단 경로를 구할때 다익스트라 알고리즘을 사용한다. 다익스트라 알고리즘은 반드시 음수 사이클이 존재하지 않아야 한다. 만약 음수 사이클이 발생할 수 있다만 벨만 포드 알고리즘을 이용해야 한다.
다익스트라는 시작점으로부터 cost에 대한 min heap을 이용하여 가장 cost가 적은 순서대로 계속해서 길을 찾아보며 만약 도착 노드를 발견하는 순간 종료된다.
코드를 보자.
이 소스코드는 백준 최단 경로를 기반으로 하고 있다.
#include <iostream>
#include <vector>
#include <utility>
#include <queue>
using namespace std;
typedef pair<int, int> pii;
#define ff first
#define ss second
#define mp(x, y) make_pair((x), (y))
int V, E, S;
int a, b, c;
#define INF 1e9
vector<pii> adj[20001];
int cost[20001];
void dijk(int s){
priority_queue<pii> pq;
pq.push(mp(0, s));
cost[s] = 0;
while(!pq.empty()){
int u = pq.top().ss;
int c = -pq.top().ff;
pq.pop();
if(c > cost[u]) continue;
for(int i = 0 ; i < adj[u].size(); i++){
int v = adj[u][i].ff;
int nc = c + adj[u][i].ss;
if(nc < cost[v]){
cost[v] = nc;
pq.push(mp(-nc, v));
}
}
}
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> V >> E >> S;
for(int i = 0; i <= V; i++){
cost[i] = INF;
}
for(int i = 0; i < E; i++){
cin >> a >> b >> c;
adj[a].push_back(mp(b, c));
}
dijk(S);
for(int i = 1; i <= V; i++){
if(cost[i]==INF)
cout << "INF" << endl;
else
cout << cost[i] << endl;
}
}
'프로그래밍 > 컴퓨터 알고리즘' 카테고리의 다른 글
[알고리즘] 가장 기본적인 DFS와 BFS (0) | 2019.05.09 |
---|---|
[알고리즘] 구간합을 위한 세그먼트 트리와 펜윅 트리의 구현 (0) | 2019.05.07 |
[알고리즘] 최소 신장 트리를 위한 Disjoint set과 크루스칼 알고리즘 (0) | 2019.05.07 |
[알고리즘] 트리 순회 (전위, 중위, 후위)와 중위+후위 -> 전위 순회 찾기 (0) | 2019.05.07 |
[알고리즘] 퀵 소트와 머지 소트 비교와 구현 (0) | 2019.05.06 |