Dijkstra堆优化

我的心愿是世界和平!

#include
#include
#include
#include
#include
#include
#include
using namespace std;

#define MAXN 0x3f3f3f3f
int dis[100005],head[100005];
bool sign[100005];
struct edge{
    int u,v,w;
    int next;
}e[200005];
priority_queue,vector >,greater > >q;
int n,m,k,s,cnt=1;

void add(int a,int b,int c){
    e[cnt]=((edge){a,b,c,head[a]});
    head[a]=cnt++;
}

void Dijkstra(){
    memset(dis,MAXN,sizeof(dis));
    memset(sign,0,sizeof(sign));
    dis[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty()){
        int t=q.top().second;
        q.pop();
        if(sign[t]){
            continue;
        }
        sign[t]=1;
        for(int i=head[t];i!=0;i=e[i].next){
            if(dis[e[i].v]>dis[t]+e[i].w&&!sign[e[i].v]){
                dis[e[i].v]=dis[t]+e[i].w;
                q.push(make_pair(dis[e[i].v],e[i].v));
            }
        }
    }
}

int main(){
    memset(head,0,sizeof(head));
    scanf("%d%d%d",&n,&m,&s);//输入n点数,m边数,s起点
    for(int i=1;i<=m;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);//输入a,b两点及其距离c
        add(a,b,c);
        add(b,a,c);
    }
    Dijkstra();
    for(int i=1;i<=n;i++){
        printf("%d ",dis[i]);
    }
    return 0;
}

你可能感兴趣的:(暑期集训--算法)