社区讨论

Dijkstra 90分 求调

P3371【模板】单源最短路径(弱化版)参与者 4已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@m5ixskza
此快照首次捕获于
2025/01/05 09:31
去年
此快照最后确认于
2025/11/04 11:57
4 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e6+5;
const int maxe = 1e6+5;
const int inf=0x7f;
int n,m,s;

int dis[maxn];
int vis[maxn];

typedef pair<int,int> pii;
priority_queue<pii,vector<pii>,greater<pii>> q;

struct linkList {
    typedef struct {int u,v,w,next;} edge;
    edge e[maxe];
    int h[maxn],edge_cnt=0;
    linkList(){
        edge_cnt=0;
        memset(h,-1,sizeof(h));
    }

    //遍历点u 周围点
    template<typename U>
    void for_each(int u,U func){
        for(int i = h[u] ; i !=-1;i = e[i].next)
            func(e[i].u,e[i].v,e[i].w); //u v w
    }

    void add(int u,int v,int w=0){
        e[edge_cnt] = {u,v,w,h[u]};
        h[u] = edge_cnt++; //h[u] = 0; edge_cnt = 1;
    }
    void add2(int u,int v,int w=0){
        add(u,v,w);
        add(v,u,w);
    }
    //下标访问
    edge& operator[](int i){ return e[i]; }
    //返回head[u]
    int operator()(int u){ return h[u]; }
}g;

void init(){
    cin>>n>>m>>s;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        g.add(u,v,w);
    }
}

void dijkstra(){
    dis[s]=0;
    q.push(make_pair(0,s));
    while(!q.empty()){
        int u=q.top().second;
        q.pop();
        if(vis[u]==1) continue;
        vis[u]==1;
        for(int i=g(u);~i;i=g[i].next){
            int v=g[i].v;
            int w=g[i].w;
            if(vis[v]==0&&dis[u]+w<dis[v]){
                dis[v]=dis[u]+w;
                q.push(make_pair(dis[v],v));
            }
        }
    }

}

int main(){
    init();
    memset(dis,inf,sizeof(dis));
    dijkstra();
    for(int i=1;i<=n;i++){
        cout<<dis[i]<<" ";
    }
    return 0;
}

回复

5 条回复,欢迎继续交流。

正在加载回复...