思路
这道题是最短路径模板题,不过需要dij加上小根堆优化才能过。
用邻接表实现。
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
#include<queue>
#define lzh pair<int,int>
using namespace std;
int dis[300010],v[300010];
priority_queue<lzh> q;
int hd[300010],tot;
int n,m,s,u,yy,w;
struct node
{
int y,next,w;
}a[300010];
void add(int u,int v,int w)
{
a[++tot]=(node){v,hd[u],w};
hd[u]=tot;
}
void dij()
{
for(int i=1; i<=n; i++)
dis[i]=1e9;
dis[s]=0;
q.push(make_pair(0,s)); //把 最短路径 和 点 合并扔到堆里
while(!q.empty())
{
int dx=q.top().second;
q.pop();
if(v[dx]) //大大优化的一步:去过的白点不能再去
continue;
v[dx]=1;
for(int i=hd[dx]; i; i=a[i].next)
{
int to=a[i].y;
if(dis[dx]+a[i].w<dis[to])
{
dis[to]=dis[dx]+a[i].w;
q.push(make_pair(-dis[to],to));
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1; i<=m; i++)
{
scanf("%d%d%d",&u,&yy,&w);
add(u,yy,w);
}
dij();
for(int i=1; i<=n; i++)
cout<<dis[i]<<" ";
return 0;
}