// luogu-judger-enable-o2
#include<bits/stdc++.h>
using namespace std;
long long n,heap_size;
long long N,m,s,dis[100010];
bool vis[100010];
struct node{
long long to,w;
};
struct vp{
long long num,d;
}heap[100010];
vector<node> Q[100010];
void add(long long d,long long num){
heap[++heap_size].d=d;
heap[heap_size].num=num;
int now=heap_size;
while(now>1){
int next=now>>1;
if(heap[now].d>=heap[next].d) break;
swap(heap[now],heap[next]);
now=next;
}
}
void cut(){
long long res=heap[heap_size].d;
heap[1]=heap[heap_size];
heap_size--;
int now=1;
while(now*2<=heap_size){
int next=now*2;
if(next<heap_size&&heap[next+1].d<heap[next].d) next++;
if(heap[now].d<=heap[next].d) break;
swap(heap[now],heap[next]);
now=next;
}
}
void init(){
for(int i=1;i<=n;i++){
vis[i]=false;
dis[i]=2147483647;
}
dis[s]=0;
for(int i=1;i<=m;i++){
int start,to,wei;
node e;
cin>>start>>to>>wei;
e.to=to;e.w=wei;
Q[start].push_back(e);
}
}
void dij(){
dis[s]=0;
add(0,s);
while(heap_size){
vp kk=heap[1];
cut();
int x=kk.num,d=kk.d;
if(vis[x]) continue;
vis[x]=1;
for(int i=0;i<Q[x].size();i++){
int y=Q[x][i].to;
if(dis[y]>dis[x]+Q[x][i].w){
dis[y]=Q[x][i].w+dis[x];
if(!vis[y]){
add(dis[y],y);
}
}
}
}
}
int main(){
cin>>n>>m>>s;
init();
dij();
for(int i=1;i<=n;i++) cout<<dis[i]<<" ";
}
单源最短路径(Dijkstra)+堆优化
最新推荐文章于 2022-10-16 19:42:43 发布