记录一个最短路的题 这个是用堆优化的Dijkstra算法
Dijkstra算法的时间复杂度是O(n*n) n是1e5的话 就会超时,优化后时间复杂度为O((n+m)log n)
原题链接
(参考第一篇题解)
//最短路
#include <iostream>
#include <queue>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,s;
int dis[100010];//记录所有点与起点的距离,初始化为INF
int vis[100010];//记录当前点是否被访问过
int cnt;//记录边数 从1开始
int head[100010];//记录与点u相连的最后一条边
struct edge{
int to;
int next;
int w;
}e[200010];
void add_edge(int u,int v,int w){
cnt++;
e[cnt].to=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
struct node{
int dis;//距离
int pos;//点
bool operator<(const node &x)const{
return x.dis<dis;
}
};
std::priority_queue<node> q;
void dijkstra()
{
dis[s]=0;
q.push((node){0,s});
while(!q.empty()){
node temp=q.top();
q.pop();
int x=temp.pos;
int d=temp.dis;
if(vis[x])
continue;
vis[x]=1;
for(int i=head[x];i;i=e[i].next)
{
int y=e[i].to;
if(dis[y]>dis[x]+e[i].w){
dis[y]=dis[x]+e[i].w;
// if(!vis[y]){
q.push((node){dis[y],y});
// }
}
}
}
}
int main()
{
cin>>n>>m>>s;
for(int i=1;i<=n;++i){
dis[i]=INF;
}
while(m--){
int u,v,w;
cin>>u>>v>>w;
add_edge(u,v,w);
}
dijkstra();
for(int i=1;i<=n;++i){
cout<<dis[i]<<" ";
}
return 0;
}