蒟蒻不知道dij怎么搞优先队列(加结构体)优化,大佬能帮个忙吗?

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

Azure__ @ 2022-03-18 18:19:22

五个点全部TLE,优先队列要套结构体。麻烦大佬们照我的思路调一下,感谢。


#include<bits/stdc++.h>
using namespace std;
int n,m,s,d[100001];
bool f[100001];
struct Edge{
    int to,w,next;
}; Edge edge[1000001];
int tot,pre[1000001];
inline void add(int u,int v,int w){
    edge[tot].to=v;
    edge[tot].w=w;
    edge[tot].next=pre[u];
    pre[u]=tot;
    tot++;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    cin>>n>>m>>s;
    for(int i=1;i<=n;i++) pre[i]=-1;
    for(int i=1;i<=n;i++) d[i]=1e10;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        add(u,v,w);
    }
    int t=n;
    d[s]=0;
    while(t--){
        int m=-1;
        for(int i=1;i<=n;i++){
            if(f[i]==0&&(m==-1||d[m]>d[i])){
                m=i;
            }
        }
        f[m]=1;
        for(int i=pre[m];i!=-1;i=edge[i].next){
            int v=edge[i].to,w=edge[i].w;
            if(!f[v]&&d[m]+w<d[v]){
                d[v]=d[m]+w;
            }
        }
    }
    for(int i=1;i<=n;i++){
        cout<<d[i]<<" ";
    }
    return 0;
}
```cpp

by Jur_Cai @ 2022-03-18 18:35:37

@Azure__ 重载运算符 / 手写堆


by Azure__ @ 2022-03-18 19:02:50

@Jrz、 我不会,教教我好吗


by osky123456 @ 2022-03-18 19:03:31

@Azure__ oiwiki


|