为什么?
查看原帖
为什么?
1114241
vectorxyz楼主2024/9/28 20:15

刚学 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;
}


2024/9/28 20:15
加载中...