Dijkstra堆优化学习

最短路径例题

今天特地学习了Dijkstra的堆优化(主要是慕名已久)。

我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)]

与原来的Dijkstra操作基本一致,主要有以下几点:

1.将起点放入堆中

2.开始while循环

3.取出堆顶

4.如果已经拓展过就continue

5.松弛操作同时满足条件放入堆

6.repeat step3

code

#include <cstdio>
#include <queue>
#include <vector>
using namespace std;
struct node{
    int val,num;
    bool operator <(const node &x) const {
        return val>x.val;
    }
};
priority_queue< node > dij;
vector <pair<int,int> >a[10001];
int n,m,s,dist[10001],done[10001]; 
int main(){
    scanf("%d%d%d",&n,&m,&s);
        for(int i=1;i<=m;i++){
            int x,y,c;
            scanf("%d%d%d",&x,&y,&c);
            a[x].push_back(make_pair(y,c));
        }
        for(int i=1;i<=n;i++)dist[i]=2147483647;
    dist[s]=0;
    dij.push((node){0,s});
        while(!dij.empty()){
            int front=dij.top().num;
            dij.pop();
            if(done[front])continue;
            done[front]=true;
                for(int i=0;i<a[front].size();i++){
                    int to=a[front][i].first,vl=a[front][i].second;
                    if(!done[to]&&dist[front]+vl<dist[to]){
                        dist[to]=dist[front]+vl;
                        dij.push((node){dist[to],to}); 
                    }
                }
        }
        for(int i=1;i<=n;i++)printf("%d ",dist[i]);
    return 0;
}

 

posted @ 2017-09-25 19:16  Cptraser  阅读(256)  评论(0编辑  收藏  举报