Dijkstra求最短路
最多1e5个点 2e5条边 求s点出发的最短路;
输入 n,m,s;
优先队列+dijkstra
正确版本
#include<bits/stdc++.h>
using namespace std;
#define maxn 200010
#define maxm 200010
#define inf 0x3f3f3f3f
#define int long long
inline int read()
{
int x=0,k=1; char c=getchar();
while(c<'0'||c>'9'){if(c=='-')k=-1;c=getchar();}
while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+(c^48),c=getchar();
return x*k;
}
struct edge{
int v,w;
}e[maxm];
int cnt,n,m,s,vis[maxn],dis[maxn];
vector<edge>p[100005];
struct node{
int w,now;
bool operator <(const node&x)const
{
return w>x.w;
}
};
priority_queue<node>q;
inline void dij(){
memset(dis,inf,sizeof(dis));
dis[s]=0;
q.push((node){0,s});
while(!q.empty()){
node x=q.top();
q.pop();
int u=x.now;
if(vis[u])continue; //代表每个点只取一次,很重要的优化
vis[u]=1;
for(int i=0;i<p[u].size();i++){
int v=p[u][i].v;
if(dis[v]>dis[u]+p[u][i].w){
dis[v]=dis[u]+p[u][i].w;
q.push((node){dis[v],v});
}
}
}
}
signed main(){
n=read(),m=read(),s=read();
for(int i=1,x,y,z;i<=m;i++){
x=read(),y=read(),z=read();
p[x].push_back((edge){y,z});
}
dij();
for(int i=1;i<=n;i++){
printf("%lld ",dis[i]);
}
return 0;
}