刚学 SLF + LLL,为什么加了这个优化反而 TLE 50pts了?
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
template<typename T>
T read(T x)
{
T opt = 1, sum = 0;
char ch = getchar();
while(!isdigit(ch)) opt = (ch == '-') ? -1 : 1, ch = getchar();
while( isdigit(ch)) sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();
return opt * sum;
}
#define read read(0ll)
const int N = 5e5 + 5, INF = 1e9;
struct node
{
int v, w;
};
vector<node> g[N];
int n, m;
int _[N], d[N], vis[N], dist[N];
bool spfa(int s){
memset(d, 0x3f, sizeof(d));
memset(vis, 0, sizeof(vis));
memset(_, 0, sizeof(_));
deque<int> q;
q.push_front(s);
d[s] = 0;
vis[s] = 1;
double sum = 0; int cnt = 1;
while(q.size()){
int u = q.front(); q.pop_front();
if(cnt * d[u] > sum){
q.push_back(u);
}
sum -= d[u], cnt -- ;
vis[u] = 0;
for(auto &[v,w]:g[u]){
if(d[v] > d[u] + w){
d[v] = d[u] + w;
if(!vis[v]){
vis[v] = 1;
sum += d[v], cnt ++ ;
if(q.size() && d[v] < d[q.front()]) q.push_front(v);
else q.push_back(v);
if(++_[v] == n){
return false;
}
}
}
}
}
return true;
}
signed main()
{
int T = read;
while(T -- ){
n = read, m = read;
for(int i = 1;i <= n;i ++ ) g[i].clear();
while(m -- ){
int u = read, v = read, w = read;
if(w >= 0) g[v].push_back({u, w});
g[u].push_back({v, w});
}
if(!spfa(1)) puts("YES");
else puts("NO");
}
return 0;
}