Dijkstra算法

news/发布时间2024/5/5 9:39:43

单源最短路算法,不能处理负环,朴素版时间复杂度\(O(n^2)\),堆优化版时间复杂度\(O(nlogn)\)
Dijkstra算法的流程是:
将所有的节点分为A、B的两个集合,一开始A集合中只有起点,其他的节点在B集合。定义B中的节点与A的距离:若邻接A中的结点,则距离为边权;反之距离无穷大。
1.找到与A距离最小的B集合中的节点,称之为d。(朴素版需要遍历B集合,堆优化版直接得到)
2.将d加入集合A,并在集合B中删去d。
3.更新B到A的距离。(只需更新d在B中的邻接节点)
4.若B集合为空,则退出;反之回到步骤1。

模板题目练习:洛谷:P4779

代码示例:(用优先队列实现的堆优化版)

#include <bits/stdc++.h>const int maxN = 100005, maxM = 500005;struct edge
{int to, dis, next;
};
edge eg[maxM];int head[maxN], dis[maxN], cnt;
bool vis[maxN];
int n, m, s;inline void add_edge(int u, int v, int d)
{cnt++;eg[cnt].dis = d;eg[cnt].to = v;eg[cnt].next = head[u];head[u] = cnt;
}struct node
{int dis;int pos;bool operator<(const node& x) const{return x.dis < dis;}
};std::priority_queue<node> nd;void dijkstra()
{dis[s] = 0;nd.push(node({ 0, s }));while (!nd.empty()){node tmp = nd.top();nd.pop();int x = tmp.pos, d = tmp.dis;if (vis[x])continue;vis[x] = true;for (int i = head[x]; i; i = eg[i].next){int y = eg[i].to;if (dis[y] > dis[x] + eg[i].dis){dis[y] = dis[x] + eg[i].dis;if (!vis[y]){nd.push(node({ dis[y], y }));}}}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ulsteruni.cn/article/00268707.html

如若内容造成侵权/违法违规/事实不符,请联系编程大学网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

找win电脑代理地址

1.进入控制面板2.Internet属性3.局域网设置

Ubuntu部署有道QAnything(中间涉及到更换mysql容器端口)

系统配置版本:Ubuntu 20.04 有两块3090的显卡 下载相关文件首先下载源码,下载完成后解压得到QAnything-master文件夹 github下载地址:https://github.com/netease-youdao/qanything gitee下载地址:https://gitee.com/netease-youdao/QAnything?_from=gitee_search 下载emb…

03-支付服务

1. 交易流程 下面我们来看下基础服务组件中的交易模块,我们已完成结算功能,如图所示,在结算这个模块中我们都会进入到一个子流程【交易流程】:对于交易,大家应该都知道,就是买东西付款,卖东西收款,在任何一个盈利的系统中,都离不开交易模块,下图是一个扫码支付的粗略…

读天才与算法:人脑与AI的数学思维笔记03_AlphaGo

读天才与算法:人脑与AI的数学思维笔记03_AlphaGo1. 国际象棋 1.1. 1997年计算机“深蓝”(Deep Blue)击败了顶尖国际象棋手,但机器取代数学研究机构还言之尚早 1.2. 下国际象棋与数学的形式化证明颇有相似之处,但学者认为中国围棋的思维方式更能够体现数学家思考的创造性和…

框架图与动机结构化与可重定目标代码生成

框架图与动机结构化与可重定目标代码生成 用于数值计算的代码生成方法传统上侧重于优化循环嵌套的性能。相关分析侧重于标量元素,因为循环嵌套的主体通常计算单个元素。这样的分析必须考虑内存依赖性与混叠。这些方法在过去进行了深入研究,并已达到高度成熟。当从像C或Fortra…

MVCC

多版本并发控制,多个事物并发的情况下到底该访问哪个版本你解释一下MVCC?mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突, 它的底层实现主要是依赖了数据库中的三个部分,隐藏字段,undo log日志和readView读视图 隐藏字段是指:在mysql中给每…