找回密码
 中文实名注册
查看: 84|回复: 0

dijikstra堆优化算法代码(含注释)

[复制链接]

709

主题

1103

帖子

2万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
21265
发表于 2024-11-23 20:04:42 | 显示全部楼层 |阅读模式
[C++] 纯文本查看 复制代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 9;//常数
const int M = 1e4 + 9;
typedef pair<int, int> pii;//first是距离,second是队列中的点
struct edge {//边
    int v, w, next;
} e[M << 1];
int head[N], len;//链式前向星
void init() {//链式前向星存图
    memset(head, -1, sizeof(head));
    len = 0;
}
void add(int u, int v, int w) {//链式前向星存图
    e[len] = {v, w, head[u]};
    head[u] = len++;
}
int n, m;
int dis[N];//距离
bool vis[N];//是否被访问
void dijkstra(int u) {
    memset(vis, false, sizeof(vis));//初始化
    memset(dis, 0x3f, sizeof(dis));
    priority_queue<pii, vector<pii>, greater<pii>> q;//优先队列
    q.push({dis[u] = 0, u});//放入起点
    while (!q.empty()){
        int u = q.top().second;//队头上的点
        q.pop();
        if (vis[u]){//是否被访问
            continue;
        }
        vis[u] = true;//标记为访问
        for (int j = head[u]; ~j; j = e[j].next) {//链接
            int v = e[j].v;//下一个点
            int w = e[j].w;//权值
            if (!vis[v] && dis[v] > dis[u] + w) {//更新距离
                q.push({dis[v] = dis[u] + w, v});
            }
        }
    }
}
int main() {
    init();
    int u, v, w;
    cin >> n >> m;
    for(int i=1;i<=m;i++){//存边
        cin >> u >> v >> w;
        add(u, v, w);//无向图
        add(v, u, w);
    }
    dijkstra(1);//跑函数
    cout<<dis[n]<<endl;//结果
    return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 中文实名注册

本版积分规则

小黑屋|东台市机器人学会 ( 苏ICP备2021035350号-1;苏ICP备2021035350号-2;苏ICP备2021035350号-3 )

GMT+8, 2025-3-14 03:30 , Processed in 0.045203 second(s), 38 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表