P4779 【模板】单源最短路径(标准版)
贴个模板吧,非负权图最优化的dijskra比spfa快。
#include<bits/stdc++.h>
using namespace std;
const int maxn=500005;
int inf=0x3f3f3f3f;
int n,m,head[maxn],next[maxn],num,vis[maxn];
long long dis[maxn];
struct node{
int v,wight,next;
}s[maxn];
void add(int u,int v,int w){
s[++num]=(node){v,w,head[u]};
head[u]=num;
}
pair<int,int>p1;
priority_queue< pair<int,int> >q;
void spfa(int x){
int i,j;
memset(dis,inf,sizeof(dis));
dis[x]=0;
q.push(make_pair(0,x));
while(!q.empty()){
int k=q.top().second;
q.pop();
if(vis[k]) continue;
vis[k]=1;
for(i=head[k];i;i=s[i].next){
int to=s[i].v;
if(dis[to]>dis[k]+s[i].wight){
dis[to]=dis[k]+s[i].wight;
if(!vis[to])
q.push(make_pair(-dis[to],to));
}
}
}
}
int main()
{
int i,j,x,y,z,d;
scanf("%d %d %d",&n,&m,&d);
for(i=0;i<m;i++){
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
}
spfa(d);
for(i=1;i<=n;i++){
if(i!=1) printf(" ");
printf("%lld",dis[i]);
}
return 0;
}
堆优化的spfa
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn=500005;
int inf=0x3f3f3f3f;
int n,m,head[maxn],next[maxn],num,v[maxn];
long long dis[maxn];
struct node{
int to,wight,next;
}s[maxn];
void add(int u,int v,int w){
s[++num].next=head[u];
s[num].to=v;
s[num].wight=w;
head[u]=num;
}
struct edge{
int dis,pos;
bool operator<(const edge &x)const{
return x.dis<dis;
}
};
void spfa(int x){
priority_queue<edge>q;
int i,j;
memset(dis,inf,sizeof(dis));
dis[x]=0;
v[x]=1;
q.push((edge){0,x});
while(!q.empty()){
edge k=q.top();
q.pop();
int t=k.pos;
v[t]=0;
for(i=head[t];i;i=s[i].next){
int to=s[i].to;
if(dis[to]>dis[t]+s[i].wight){
dis[to]=dis[t]+s[i].wight;
if(!v[to]){
v[to]=1;
q.push((edge){dis[to],to});
}
}
}
}
}
int main()
{
int i,j,x,y,z,d;
scanf("%d %d %d",&n,&m,&d);
for(i=0;i<m;i++){
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
}
spfa(d);
for(i=1;i<=n;i++){
if(i!=1) printf(" ");
printf("%lld",dis[i]);
}
return 0;
}