pbds thin heap优化 dij 2RE 剩下 TLE,求调

P4779 【模板】单源最短路径(标准版)

FuckYouJinhai @ 2022-12-12 13:16:10

感觉问题有点大/zhq

#include<bits/stdc++.h>
#include<ext/pb_ds/priority_queue.hpp>
using namespace std;
using namespace __gnu_pbds;
struct edge{
    int to,next,value;
    edge(int T,int N,int V){to=T;next=N;value=V;}
};
vector<edge>e;
int head[100010];
inline void addEdge(int s,int E,int v){
    static int Cnt=0;
    e.push_back(edge(E,v,head[s]));
    head[s]=Cnt++;
}//维克托实现链式前向星
__gnu_pbds::priority_queue<std::pair<int,int>,std::greater<std::pair<int,int>>,thin_heap_tag>q;//斐波那契堆
//怄火、挥手、街舞、转圈
long long dis[100020];
inline void dij(int s){
    memset(dis,0x3f,sizeof(dis));
    dis[s]=0;q.push(make_pair(0,s));//玄学操作
    while(!q.empty()){
        int to=q.top().second,value=q.top().first;q.pop();//Good bye
        if(value!=dis[to])continue;//松弛
        for(int i=head[to];i;i=e[i].next){
            int to2=e[i].to,value2=e[i].value;
            if(dis[to]+value2<dis[to2])
                dis[to2]=dis[to]+value2,q.push(make_pair(dis[to2],value2));
        }
    }
}
int n,m,s;
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr),cout.tie(nullptr);
    cin>>n>>m>>s;
    for(int i=1;i<=m;++i){
        int u,v,w;
        cin>>u>>v>>w;
        addEdge(u,v,w);
    }
    dij(s);
    for(int i=1;i<=n;++i)cout<<dis[i]<<" ";
    return 0;
}

by robinyqc @ 2022-12-12 15:33:25

什么离谱注释


by liangbowen @ 2022-12-12 16:00:35

@FiveUnderlines 建议去看一下别人 dij 的代码,您都没有加标记,还有注释是不是乱加的

if(value!=dis[to])continue;//松弛


by FuckYouJinhai @ 2022-12-12 16:00:58

@liangbowen 是乱加的没错啊(


|