怀疑我写的SPFA的优化是个伪的
查看原帖
怀疑我写的SPFA的优化是个伪的
933604
LYBT楼主2023/12/31 15:09

弄半天还没朴素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的优化

2023/12/31 15:09
加载中...