代码:
#include <bits/stdc++.h>
#define MaxPointNum 100000
#define MaxEdgeNum 200000
#define inf 2147483647
using namespace std;
int to[MaxEdgeNum+5],nxt[MaxEdgeNum+5],wgt[MaxEdgeNum+5];
int n,m,srt,cnt;
struct node{
int fst,dis;
bool vis;
bool operator <(const node x)const{
return dis<x.dis;
}
}pnt[MaxPointNum+5];
void add(int u,int v,int w){
to[++cnt]=v;
wgt[cnt]=w;
nxt[cnt]=pnt[u].fst;
pnt[u].fst=cnt;
}
void dijkstra(){
for(int i=1;i<=n;i++) pnt[i].dis=inf;
priority_queue<node> que;
pnt[srt].dis=0;
que.push(pnt[srt]);
while(que.size()){
node u=que.top();
que.pop();
if(u.vis) continue;
u.vis=true;
for(int i=u.fst;i;i=nxt[i]){
int v=to[i];
if(u.dis+wgt[i]<pnt[v].dis){
pnt[v].dis=u.dis+wgt[i];
if(!pnt[v].vis) que.push(pnt[v]);
}
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&srt);
for(int i=0;i<m;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dijkstra();
for(int i=1;i<=n;i++) printf("%d ",pnt[i].dis);
return 0;
}
链式前向星 + 堆优化 Dijkstra