首页 > 其他 > 详细

最短路径

时间:2020-07-27 16:04:25      阅读:49      评论:0      收藏:0      [点我收藏+]
#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;
}

复制同学代码参考

最短路径

原文:https://www.cnblogs.com/0211ji/p/13384932.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!