예제로 간단히 정리하기
아래는 heap djikstra인데 오름차순 정렬해주는 heap을 사용하였다.
자동으로 O(logn)에 정렬해주기 때문에 매우 유용하다.
#include <iostream>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <queue>
#define INF 99999999
using namespace std;
int n,e;
int s;
struct tuple2 {
int node;
int val;
};
struct pq_tuple {
int idx;
int dist;
bool operator < (const pq_tuple &node) const {
return dist>node.dist;
}
};
vector <tuple2> A[20005];
long long dist[20005];
int visited[20005];
priority_queue <pq_tuple> pq;
void dijkstra() {
dist[s]=0;
pq_tuple srg;
int i,j;
int _min,min_idx;
srg.idx=s;
srg.dist=0;
pq.push(srg);
int flag;
while(!pq.empty()) {
min_idx=pq.top().idx;
_min=pq.top().dist;
if(visited[pq.top().idx]==1) {
pq.pop();
continue;
}
visited[pq.top().idx]=1;
pq.pop();
for(i=0;i<A[min_idx].size();i++) {
if(visited[A[min_idx][i].node]==0 && dist[A[min_idx][i].node]>_min+A[min_idx][i].val) {
dist[A[min_idx][i].node]=_min+A[min_idx][i].val;
srg.idx=A[min_idx][i].node;
srg.dist=_min+A[min_idx][i].val;
pq.push(srg);
}
}
}
for(i=1;i<=n;i++) {
if(dist[i]!=INF) {
printf("%lld\n",dist[i]);
} else {
printf("INF\n");
}
}
}
int main()
{
//freopen("input.txt","r",stdin);
scanf("%d %d",&n,&e);
scanf("%d",&s);
int i,a;
tuple2 srg;
for(i=0;i<e;i++) {
scanf("%d %d %d",&a,&srg.node,&srg.val);
A[a].push_back(srg);
}
for(i=1;i<=n;i++) dist[i]=INF;
dijkstra();
return 0;
}
'내용 정리' 카테고리의 다른 글
[알고리즘] Dijkstra (0) | 2021.01.22 |
---|---|
[C++] STL sort (0) | 2021.01.22 |