弄半天还没朴素SPFA跑得快。。。
#include<bits/stdc++.h>
using namespace std;
const int inf=(1<<31)-1;
int read(){
char c=getchar();
int sum=0,flag=1;
while(c<'0'||c>'9'){if(c=='-') flag=-1;c=getchar();}
while(c>='0'&&c<='9') sum=(sum<<1)+(sum<<3)+(c^48),c=getchar();
return sum*flag;
}
void write(int x){
if(x<0) x=(~x)+1,putchar('-');
if(x>9) write(x/10);
putchar(x%10|48);
}
const int N=1e5+5,M=2e5+5;
int n=read(),m=read(),s=read(),dis[N],head[N],tot;
bool vis[N];
struct node{
int to,w,nxt;
}e[M];
void add_edge(int u,int v,int w){
e[++tot].to=v;
e[tot].w=w;
e[tot].nxt=head[u];
head[u]=tot;
}
void spfa(){
int sum=0,cnt=0;
for(int i=1;i<=n;i++) dis[i]=(i==s? 0:inf);
deque<int>q;
q.push_front(s);
vis[s]=1;
cnt++;
while(!q.empty()){
int u=q.front();
while(dis[u]*cnt>sum){
q.pop_front();
q.push_back(u);
u=q.front();
}
q.pop_front();
sum-=dis[u];
cnt--;
vis[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to,w=e[i].w;
if(dis[v]>dis[u]+w){
dis[v]=dis[u]+w;
if(!vis[v]){
if(q.size()&&dis[v]<dis[q.front()]) q.push_front(v);
else q.push_back(v);
sum+=dis[v];
cnt++;
vis[v]=1;
}
}
}
}
}
int main(){
for(int i=1;i<=m;i++){
int u=read(),v=read(),w=read();
add_edge(u,v,w);
}
spfa();
for(int i=1;i<=n;i++) write(dis[i]),putchar(' ');
return 0;
}
有大佬能解释吗?我用的LLL和SLF的优化