小根堆:
struct Node{
ll dist;
int pos;
bool operator>(const Node &x)const{
return dist>x.dist;
}
}heap[maxm<<2];
int tot;
void ins1(Node x) {
tot++;
heap[tot]=x;
int i=tot;
int j=i/2;
while(j&&heap[j]>heap[i]) {
swap(heap[j],heap[i]);
i=j;
j=i/2;
}
}
Node pop1() {
Node x=heap[1];
heap[1]=heap[tot];
tot--;
int i=1;
int j=i*2;
if(j+1<=tot&&heap[j]>heap[j+1])j++;
while(j<=tot&&heap[i]>heap[j]){
swap(heap[j],heap[i]);
i=j;
j=i*2;
if(j+1<=tot&&heap[j]>heap[j+1])j++;
}
return x;
}
dijkstra:
#include <iostream>
using namespace std;
#define ll long long
const int maxm=2e6+5;
int head[maxm],nt[maxm],to[maxm],w[maxm],cnt;
bool mark[maxm];
ll d[maxm];
int n,m,s;
struct Node{
ll dist;
int pos;
bool operator>(const Node &x)const{
return dist>x.dist;
}
}heap[maxm<<2];
int tot;
void ins1(Node x) {
tot++;
heap[tot]=x;
int i=tot;
int j=i/2;
while(j>0&&heap[j]>heap[i]) {
swap(heap[j],heap[i]);
i=j;
j=i/2;
}
}
Node pop1() {
Node x=heap[1];
heap[1]=heap[tot];
tot--;
int i=1;
int j=i*2;
if(j+1<=tot&&heap[j]>heap[j+1])j++;
while(j<=tot&&heap[i]>heap[j]){
swap(heap[j],heap[i]);
i=j;
j=i*2;
if(j+1<=tot&&heap[j]>heap[j+1])j++;
}
return x;
}
void add(int x,int y,int z){
cnt++;nt[cnt]=head[x];head[x]=cnt;to[cnt]=y;w[cnt]=z;
}
void dj(int st){
ins1({0,st});
for(int i=1;i<=n;i++)d[i]=1e18,mark[i]=0;
d[st]=0;
while(tot){
int x=pop1().pos;
if(mark[x])continue;
mark[x]=1;
for(int i=head[x];i;i=nt[i]){
int v=to[i];
if(d[v]>d[x]+w[i]){
d[v]=d[x]+w[i];
ins1({d[v],v});
}
}
}
}
signed main(){
scanf("%d%d%d",&n,&m,&s);
for(int i=1;i<=m;i++){
int a,b,c;scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
}
dj(s);
for(int i=1;i<=n;i++){
if(d[i]==1e18)d[i]=-1;
printf("%lld\n",d[i]);
}
return 0;
}