最短路径

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+10;
const int M=1e6+10;
const ll inf=1e18+10;
int head[N],ver[N],edge[N],nxt[N];
ll d[N];
int path[N],ans[N];
bool v[N];
int n,m,tot;
priority_queue<pair<int,int> > q;

void add(int x,int y,int z){
    ver[++tot]=y;edge[tot]=z;nxt[tot]=head[x];head[x]=tot;
}

void dijkstra(){
    for(int i=1;i<=n;i++) d[i]=inf;
    memset(v,0,sizeof(v));
    d[1]=0;
    q.push(make_pair(0,1));
    while(q.size()){
        int x=q.top().second;q.pop();
        if(v[x]) continue;
        v[x]=1;
        for(int i=head[x];i;i=nxt[i]){
            int y=ver[i],z=edge[i];
            if(d[y]>d[x]+z){
                d[y]=d[x]+z;
                path[y]=x;
                q.push(make_pair(-d[y],y));
            }
        }
    }
}

int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        int x,y,z;
        scanf("%d%d%d",&x,&y,&z);
        add(x,y,z);
        add(y,x,z);
    }
    dijkstra();
    if(d[n]==inf){
        printf("-1\n");
    }else{
        int tmp=n;
        printf("%d ",1);
        int cnt=0;
        while(path[tmp]!=1){
            ans[++cnt]=path[tmp];
            tmp=path[tmp];
        }
        for(int i=cnt;i>=1;i--){
            printf("%d ",ans[i]);
        }
        printf("%d\n",n);
    }
    return 0;
}

复制同学代码参考

posted @ 2020-07-27 13:21  吉吉的奥利奥  阅读(28)  评论(0编辑  收藏