题目链接:单源最短路径
分析
尝试了一下Dij+堆优化,时间复杂度比较稳。
模板题
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#define donkey pair<int,int>
using namespace std;
priority_queue<donkey> q;
struct lwx
{
long long to,next,w;
}e[200001];
long long tot,n,m,s,dis[100001],v[100001],hd[100001];
void add(int x,int y,int w)
{
tot++;
e[tot].to=y;
e[tot].next=hd[x];
e[tot].w=w;
hd[x]=tot;
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=m;i++)
{
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
}
memset(dis,0x7f,sizeof(dis));
memset(v,0,sizeof(v));
dis[s]=0;
q.push(make_pair(0,s));
while(!q.empty())
{
int mi=q.top().second;
q.pop();
if(v[mi]) continue;
v[mi]=true;
for(int j=hd[mi];j>0;j=e[j].next)
{
if(dis[e[j].to]>dis[mi]+e[j].w)
{
dis[e[j].to]=dis[mi]+e[j].w;
}
q.push(make_pair(-dis[e[j].to],e[j].to));
}
}
for(int i=1;i<=n;i++) cout<<dis[i]<<' ';
return 0;
}