优先队列+链式前向星存图,用于稀疏图的单源最短路径,时间复杂度为O(mlogn)。
模板题见洛谷【模板】单源最短路径(标准版) - 洛谷
弱化标准版都能AC
#include<bits/stdc++.h>
using namespace std;
#define INF 2147483647
typedef pair<int,int> PII;
const int N=1e5+5;
int head[N];
struct node
{
int to,dis,next;
}edge[200005];
int dist[N];
bool st[N];
int n,m,s,cnt;
void add(int from,int to,int dis)
{
edge[cnt].to=to;
edge[cnt].dis=dis;
edge[cnt].next=head[from];
head[from]=cnt++;
}
void dijkstra()
{
for(int i=1;i<=n;i++)
dist[i]=INF;
dist[s]=0;
priority_queue<PII ,vector<PII> ,greater<PII> > t;
t.push({0,s});
while(t.size())
{
PII temp=t.top();
t.pop();
int distance=temp.first,vec=temp.second;
if(st[vec])
continue;
st[vec]=true;
for(int i=head[vec];i != -1;i=edge[i].next)
{
int j=edge[i].to;
if(dist[j] > dist[vec]+edge[i].dis)
{
dist[j]=dist[vec]+edge[i].dis;
t.push({dist[j],j});
}
}
}
}
int main()
{
scanf("%d%d%d",&n,&m,&s);
memset(head,-1,sizeof head);
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dijkstra();
for(int i=1;i<=n;i++)
{
cout<<dist[i]<<' ';
}
}