rt
#include<bits/stdc++.h>
using namespace std;
const long long inf=0x3f3f3f3f3f3f3f3fLL;
const int N=3e5+5;
struct edge{
int from,to;
long long w;
edge(int a,int b,long long c){from=a;to=b;w=c;}
};
vector<edge> e[N];
struct node{
int id;
long long n_dis;
node(int b,long long c){id=b;n_dis=c;}
inline bool operator<(const node &a) const{
return n_dis>a.n_dis;
}
};
int n,m;
int pre[N];
void print_path(int s,int t){
if(s==t){
printf("%d",s);
return;
}
print_path(s,pre[t]);
printf(" %d",t);
}
long long dis[N],ans;
bool done[N];
void dijkstra(){
int s=1;
for(int i=1;i<=n;i++){
dis[i]=inf;
done[i]=false;
}
dis[s]=0;
done[s]=true;
priority_queue<node> q;
q.push(node(s,dis[s]));
while(!q.empty()){
node u=q.top();
q.pop();
if(done[u.id]) continue;
done[u.id]=true;
for(int i=0;i<e[u.id].size();i++){
edge y=e[u.id][i];
if(done[y.to]) continue;
if(dis[y.to]>u.n_dis+y.w){
dis[y.to]=u.n_dis+y.w;
q.push(node(y.to,dis[y.to]));
pre[y.to]=u.id;
}
}
}
// print_path(s,n);
}
int main(){
scanf("%d%d",&n,&m);
while(m--){
int u,v;
long long w;
scanf("%d%d%lld",&u,&v,&w);
e[u].push_back(edge(u,v,w));
}
dijkstra();
for(int i=1;i<=n;i++){
if(dis[i]>=inf) printf("-1 ");
else printf("%lld ",dis[i]);
}
return 0;
}
这份代码的子函数 dijkstra() 计算从 1 到各个节点的最短路径,问题大概率也出在这里。给出有效建议的给一个关注!