求调

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

guer_loser_lcz @ 2024-07-09 19:06:13

#include<bits/stdc++.h>
using namespace std;
long long n,m,s,mn[100100];
struct note{
    long long to,w;
};
vector<note> e[200100];
bool vis[100100];
void dij(int x){
    priority_queue<int> q;
    q.push(x);
    while(!q.empty()){
        int k=q.top();
        q.pop();
        if(vis[k])continue;
        vis[k]=1;
        for(int i=0;i<e[k].size();i++){
            if(mn[e[k][i].to]>mn[k]+e[k][i].w){
                mn[e[k][i].to]=mn[k]+e[k][i].w;
                if(!vis[e[k][i].to]){
                    q.push(e[k][i].to);
                }
            }
        }
    }
}
int main(){
    cin>>n>>m>>s;
    for(int i=1,x,y,z;i<=m;i++){
        cin>>x>>y>>z;
        e[x].push_back({y,z});
    }
    for(int i=2;i<=n;i++)mn[i]=1e10;
    dij(1);
    for(int i=1;i<=n;i++)cout<<mn[i]<<" ";
    return 0;
}

2#6对


by Mr_RedStone @ 2024-07-10 21:42:01

额 优先队列的类型应该是一个结构体,包含当前点与当前算出的最短路长度,例如。

struct Node{
  int x,d;//x当前点,d距离
  friend bool operator <(Node a,Node b){
    return a.d>b.d;//优先队列满足条件的放后面
  }
}
...
priority_queue<Node> q

优先队列根据距离排序,并非点编号。

孩子你无敌了 :D。


by Mr_RedStone @ 2024-07-10 21:44:50

@lczcy1 给你改了亿下

#include<bits/stdc++.h>
using namespace std;
long long n,m,s,mn[100100];
struct note{
    long long to,w;
};
struct Node{
    int x,d;
    friend bool operator <(Node a,Node b){
        return a.d>b.d;
    }
};
vector<note> e[200100];
bool vis[100100];
void dij(int x){
    priority_queue<Node> q;
    q.push({x,0});
    while(!q.empty()){
        auto [k,d]=q.top();
        q.pop();
        if(vis[k])continue;
        vis[k]=1;
        for(int i=0;i<e[k].size();i++){
            if(mn[e[k][i].to]>mn[k]+e[k][i].w){
                mn[e[k][i].to]=mn[k]+e[k][i].w;
                if(!vis[e[k][i].to]){
                    q.push({e[k][i].to,mn[e[k][i].to]});
                }
            }
        }
    }
}
int main(){
    cin>>n>>m>>s;
    for(int i=1,x,y,z;i<=m;i++){
        cin>>x>>y>>z;
        e[x].push_back({y,z});
    }
    for(int i=2;i<=n;i++)mn[i]=1e10;
    dij(1);
    for(int i=1;i<=n;i++)cout<<mn[i]<<" ";
    return 0;
}

by guer_loser_lcz @ 2024-07-10 21:53:43

@Mr_RedStone 严重怀疑这是你的代码


by guer_loser_lcz @ 2024-07-10 21:54:24

但又是我的


by Mr_RedStone @ 2024-07-11 08:34:39

@lczcy1 不是哥们[doge


|