蒻芨求助!为什么dijstra+堆优化超时?

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

kxr_ @ 2023-03-13 22:08:45

#include<bits/stdc++.h>
//#include<queue>               //priority_queue<pair<int,int> >q需要 
using namespace std;
const int N=1e5+1000,M=2e5+1000,INF=0x3f3f3f3f;
int n,m,tot,st;
int dis[N];
int first[N],nex[M],to[M],w[M];
bool vis[N];
priority_queue<pair<int,int> >q;        
void add(int x,int y,int z){        
    nex[++tot]=first[x];
    first[x]=tot;
    to[tot]=y;
    w[tot]=z;
}
void dijstra(){
    memset(dis,INF,sizeof(dis));
    memset(vis,0,sizeof(vis));
    dis[st]=0;                      
    q.push(make_pair(0,st));        
    while(!q.empty()){                  
        int u=q.top().second;           
        q.pop();
        if(vis[u]){
            continue;                   
        }
        vis[u]=1;
        for(int e=first[u];e;e=nex[e]){ 
            int v=to[e];            
            if(dis[u]+w[e]<dis[v]){
                dis[v]=dis[u]+w[e]; 
                q.push(make_pair(-dis[v],v));
            }
        }
    }
}
int main(){
    cin>>n>>m>>st;
    for(int i=1;i<=m;i++){
        int x,y,z;
        cin>>x>>y>>z;
        add(x,y,z);                     
        add(y,x,z);                     
    }
    dijstra();
    for(int i=1;i<=n;i++){
        cout<<dis[i]<<" ";
    }
    return 0;
}

by Loic_ @ 2023-03-13 22:14:26

为何反向加边?

如果真要加那么请开两倍数组。


by 2949767807qwer @ 2023-03-13 22:29:02

给定一个

n$ 个点,

m$ 条有向边的带非负权图,请你计算从

s$ 出发,到每个点的距离。 数据保证你能从

s$ 出发到任意点。


by RP_INT_MAX @ 2023-03-13 22:50:21

@kxr_ 有向边捏。


by kxr_ @ 2023-03-14 21:23:28

@Loic_@2949767807qwer@RP_INT_MAX 谢谢大佬提醒,AC了


|