搜索与图论——Dijkstra

最短路算法

稠密图与稀疏图

n为点数,m为边数。m远小于n的平方为稀疏图,m接近n的平方为稠密图。

稀疏图用邻接表存,稠密图用邻接矩阵存

朴素版dijkstra时间复杂度为O(n^2),对于稠密图可以ac,但遇到稀疏图时会TLE。

dijkstra函数实现步骤:

1、初始时,所有点都在圈内,所有点vis都=0,d[原点]=0,d[其他点]=+∞

2、从圈内选一个距离最小的点,打标记移除圈

3、对t的所有出边执行松弛操作(即尝试更新所有邻点的最小距离:dist[j] = min(dist[j],dist[t] + g[t][j]);)

4、重复第2、3步操作,知道圈内为空

#include<iostream>
#include<cstring>
#include<algorithm>using namespace std;const int N = 510;int n,m;
int g[N][N]; //读入图,g[x][y] = s表示,该点为x,出边指向的点为y,边权为s
int dist[N]; //从一号点走到当前点的最短距离是多少
bool vis[N]; //当前点的最短距离是不是已经被确定了,确定了打上标记出圈int dijkstra(){memset(dist,0x3f,sizeof dist);dist[1] = 0;for(int i = 0;i < n - 1;i ++ ){int t = -1;/* 这个for循环就是找出距离原点最近的点,for循环遍历所有点,if判断该点要没走过且该点到原点的距离小于t点到原点的距离,将j赋值给t,这样就可以以此找到当前没有被打上标记且距离原点最近的点了 */for(int j = 1;j <= n;j ++ )if(!vis[j] && (t == -1 || dist[t] > dist[j])) t = j;vis[t] = true; //t点距原点的最短距离已被确定,打上标记出圈/* 现在找到t了,遍历一遍所有点,有一下几种情况1.j点和t点之间无连接,那么g[t][j]=0x3f3f3f3f,特别大,会被pass2.dist[j]<=dist[t]+g[t][j],源点到j点的距离,如果经过t后距离更长了,那么不考虑3.dist[j]<=dist[t]+g[t][j],源点到j点的距离,经过t点距离更短了,那么修改dist[j]的值 */for(int j = 1;j <= n;j ++ ){dist[j] = min(dist[j],dist[t] + g[t][j]);}}if(dist[n] == 0x3f3f3f3f) return -1;else return dist[n];
}int main(){cin >> n >> m;memset(g,0x3f,sizeof g);while(m -- ){int x,y,z;cin >> x >> y >> z;g[x][y] = min(g[x][y],z);}cout << dijkstra() << endl;return 0;
}

堆优化版dijkstra 时间复杂度O(mlogn)

dijkstra函数实现步骤:

1、初始化,{0,1}入队,d[1] = 0,d[其他点] = max

2、从队头弹出距离原点距离最小的点ver,若ver扩展过则跳过,否则打标记

3、对u的所有出边执行松弛操作,把{d[j],j}压入队列

4、重复2、3步操作,直到队列为空

#include<iostream>
#include<queue>
#include<cstring>
#include<algorithm>using namespace std;typedef pair<int,int> PII;const int N = 150010;int n,m;
int h[N],w[N],e[N],ne[N],idx;
int dist[N];
bool vis[N];int add(int a,int b,int c){e[idx] = b,w[idx] = c,ne[idx] = h[a],h[a] = idx,idx ++ ;
}int dijkstra(){memset(dist,0x3f,sizeof dist);dist[1] = 0;priority_queue< PII,vector<PII>,greater<PII> > heap;heap.push({0,1});while(heap.size()){auto t = heap.top();heap.pop();int distance = t.first,ver = t.second;if(vis[ver]) continue;vis[ver] = true;for(int i = h[ver];i != -1;i = ne[i]){int j = e[i];if(dist[j] > dist[ver] + w[i]) {dist[j] = dist[ver] + w[i];heap.push({dist[j],j});}}}if (dist[n] == 0x3f3f3f3f) return -1;return dist[n];
}int main(){cin >> n >> m;memset(h,-1,sizeof h);while(m -- ){int x,y,z;cin >> x >> y >> z;add(x,y,z);}cout << dijkstra() << endl;return 0;
}

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

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

相关文章

软考高级:软件构件标准(COBRA 、J2EE、DNA2000)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

【数据结构和算法初阶(c语言)】二叉树系列oj题目图文详解

目录 1.单值二叉树 2.判断两颗二叉树是否相同 3.二叉树的前序遍历 接口了解 4.判断一棵树是不是另外一棵树的子树 5.判断一棵树是不是对称二叉树 6.二叉树遍历 1.单值二叉树 . - 力扣&#xff08;LeetCode&#xff09; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二…

Docker搭建LNMP环境实战(06):Docker及Docker-compose常用命令

Docker搭建LNMP环境实战&#xff08;06&#xff09;&#xff1a;Docker及Docker-compose常用命令 此处列举了docker及docker-compose的常用命令&#xff0c;一方面可以做个了解&#xff0c;另一方面可以在需要的时候进行查阅。不一定要强行记忆&#xff0c;用多了就熟悉了。 1、…

Fastjson配置消息转换器(时间格式问题)

问题&#xff1a; 我们可以看见&#xff0c;日期的格式有点问题。 由于ArticleListVO类的createTime成员变量是Date类型&#xff0c;默认是由java的Jackson来处理&#xff0c;使用 ISO-8601 规范来处理日期时间格式。ISO-8601 是一种国际标准的日期时间表示法&#xff0c;例如&…

案例分析-IEEE 754浮点标准

案例一&#xff1a; 请分析IEEE 754双精度浮点数规格化数的表示范围。 案例二&#xff1a; 规格化浮点数的Bias为什么采用2k-1-1而不是2k-1​&#xff1f;非规范数的指数E1-Bias而不是0-Bias&#xff1f; &#xff08;1&#xff09; ① bias 127时 E e - 127 &#xff08;00…

7.3*3卷积核生成

1.卷积核 在数字图像处理中的各种边沿检测、滤波、腐蚀膨胀等操作都离不开卷积核的生成。下面介绍如何生成各种3X3的卷积核。为后面的数字图像操作打下基础。   由于图像经过卷积操作后会减少两行两列&#xff0c;因此在生成卷积核的时候一般会对图像进行填充&#xff0c;填充…

Qt中QIcon图标设置(标题、菜单栏、工具栏、状态栏图标)

1 exe程序图标概述 在 Windows 操作系统中&#xff0c;程序图标一般会涉及三个地方&#xff1b; &#xff08;1&#xff09; 可执行程序&#xff08;以及对应的快捷方式&#xff09;的图标 &#xff08;2&#xff09; 程序界面标题栏图标 &#xff08;3&#xff09;程序在任务…

2014年认证杯SPSSPRO杯数学建模C题(第一阶段)土地储备方案的风险评估全过程文档及程序

2014年认证杯SPSSPRO杯数学建模 C题 土地储备方案的风险评估 原题再现&#xff1a; 土地储备&#xff0c;是指市、县人民政府国土资源管理部门为实现调控土地市场、促进土地资源合理利用目标&#xff0c;依法取得土地&#xff0c;进行前期开发、储存以备供应土地的行为。土地…

c++|STL简介+string类的使用(常用接口)

目录 一、STL简介 1.1STL的版本 1.2STL六大组件 1.3STL的重要性及缺陷 二、string类简介 2.1string类了解 2.2为什么学习string类 三、string类使用(常用接口) 3.1string类的成员函数 3.1.1构造函数 3.1.2析构函数 3.1.3“”运算符重载函数 3.2迭代器(iterator)s…

http认证

1.Digest认证 各字段含义&#xff1a; Nonce 服务器直接返回的数据 H1MD5(user”:”realmpassword) H2MD5(method”:”url) method为请求类型、url不包括域名 Nc 指当前的第几次请求&#xff0c;使用8位16进制显示 Cnonce 8位随机字符串 ResponseMD5(H1”:”nonce”:”…

机器学习 | 期望最大化(EM)算法介绍和实现

在现实世界的机器学习应用中&#xff0c;通常有许多相关的特征&#xff0c;但只有其中的一个子集是可观察的。当处理有时可观察而有时不可观察的变量时&#xff0c;确实可以利用该变量可见或可观察的实例&#xff0c;以便学习和预测不可观察的实例。这种方法通常被称为处理缺失…

[串联] MySQL 存储原理 B+树

InnoDB 是一种兼顾高可靠性和高性能的通用存储引擎&#xff0c;在 MySQL 5.5 之后&#xff0c;InnoDB 是默认的 MySQL 存储引擎。 InnoDB 对每张表在磁盘中的存储以 xxx.ibd 后缀结尾&#xff0c;innoDB 引擎的每张表都会对应这样一个表空间文件&#xff0c;用来存储该表的表结…