来源
板子
int spfa_slf_lll(int S){
deque<int> q;
dis[S]=0;
int temp;
q.push_back(S);
int sum=dis[S];int num=1;
cnt[S]++;
visited[S]=true; //入队即true。
int flag=0; //标志,若为真,则表示存在负环。
while(!q.empty()){
temp=q.front();
while(dis[temp]*num>sum){
//lll优化
q.pop_front();
q.push_back(temp);
temp=q.front();
}
q.pop_front();
sum-=dis[temp];
num--;
visited[temp]=false; //出队则false。
int v,w;
int t=graph[temp].size();//避免多次调用此函数。
//松弛操作
for(int i=0;i<t;i++){
v=graph[temp][i].to;
w=graph[temp][i].w;
if(dis[v]>dis[temp]+w){
dis[v]=dis[temp]+w;//更新最短路径
if(!visited[v]){
//判断是否在队列中
if(!q.empty()&&dis[v]>dis[q.front()]){
//和队头元素进行比较。
q.push_back(v);//大于入队尾
}
else q.push_front(v); //小于入队头
sum+=dis[v];
num++;
cnt[v]++;
if(cnt[v]>n){flag=1;return flag;}
visited[v]=true;
}
}
}
}
return flag;
}