fstqwq在知乎回答中表示SLF容错的时间复杂度接近 O((V+E)W) ,那么理论上是可以过掉边权和 ≤109 的P4779 ,然而第一个点总是TLE。于是我就加上了mcfx 优化,但是第一个点还是TLE,所以我想请问是数据加强了还是我的实现有误。
#include <bits/stdc++.h>
using namespace std;
long long sum_w;
int n, m, s, ecnt, VAL, L, R;
int head[100005], dis[100005], cnt_q[100005];
struct edge{
int v, w, next;
}e[200005];
void addedge(int u, int v, int w){
e[++ecnt].v = v;
e[ecnt].w = w;
e[ecnt].next = head[u];
head[u] = ecnt;
}
bool inq[100005];
void spfa(){
deque<int> q;
fill(dis + 1, dis + n + 1, 2147483647);
memset(inq, 0, sizeof inq);
memset(cnt_q, 0, sizeof cnt_q);
q.push_front(s);
inq[s] = 1;
dis[s] = 0;
while(!q.empty()){
int u = q.front();
q.pop_front();
inq[u] = 0;
for(int i = head[u]; i; i = e[i].next){
int v = e[i].v;
if(dis[v] > dis[u] + e[i].w){
dis[v] = dis[u] + e[i].w;
if(!inq[v]){
inq[v] = 1;
if(L <= cnt_q[v] && cnt_q[v] <= R){
q.push_front(v);
}else{
if(q.empty()){
q.push_back(v);
}else if(dis[q.front()] >= dis[v] - VAL){
q.push_front(v);
}else{
q.push_back(v);
}
}
++cnt_q[v];
}
}
}
}
}
int main(){
scanf("%d%d%d" ,&n ,&m ,&s);
L = 2;
R = sqrt(n);
for(int i = 1; i <= m; ++i){
int u, v, w;
scanf("%d%d%d" ,&u ,&v ,&w);
addedge(u, v, w);
sum_w += w;
}
VAL = sqrt(sum_w);
spfa();
for(int i = 1; i <= n; ++i){
printf("%d " ,dis[i]);
}
return 0;
}