본문 바로가기

내용 정리

[C++] STL heap

예제로 간단히 정리하기

아래는 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