关于SLF容错+mcfx优化
  • 板块学术版
  • 楼主lxy07830
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/22 22:44
  • 上次更新2023/10/27 14:05:35
查看原帖
关于SLF容错+mcfx优化
363322
lxy07830楼主2022/8/22 22:44

fstqwq在知乎回答中表示SLF容错的时间复杂度接近 O((V+E)W)O((V + E)\sqrt{W}) ,那么理论上是可以过掉边权和 109\le 10^9 的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;
}
2022/8/22 22:44
加载中...