传送门
关于SPFA
它死了
标准版卡SPFA,所以我们用堆优化的Dijkstra
code:
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <string>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
const int MaxN=500010;
const int MaxM=10010;
int n,m,s;
int dis[MaxN],head[MaxN];
bool vis[MaxN];
using namespace std;
int cnt=0;
struct node {
int dis;
int pos;
};
struct edge{//链式前向星
int to;
int next;
int val;
};
edge e[MaxN];
struct cmp{
bool operator () (node x,node y) {//重载运算符
return x.dis>y.dis;
}
};
priority_queue<node,vector<node>,cmp> q;//小根堆
void addedge(int u,int v,int val){//连边
e[++cnt].next=head[u];
head[u]=cnt;
e[cnt].to=v;
e[cnt].val=val;
}
void Dijkstra(int p){//求单源最短路
dis[p]=0;
q.push((node){0,p});
while(!q.empty()){
node tmp=q.top();
q.pop();
int x=tmp.pos,d=tmp.dis;
if(vis[x]) continue;
else 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].val) {
dis[y]=dis[x]+e[i].val;
if(!vis[y]) q.push((node){dis[y],y});
}
}
}
}
int main() {
scanf("%d%d%d",&n,&m,&s);
memset(dis,0x3f3f3f3f,sizeof(dis));
for(int i=1;i<=m;i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
}
Dijkstra(s);
for(int i=1;i<=n;i++) printf("%d ",dis[i]);
return 0;
}