【算法学习笔记】 图(四)用优先级队列优化Dijkstra算法求最短路径(邻接矩阵存储)
优先级队列:priority_queue,经过实验之后发现默认是首先输出最大的元素,现在想让队头为最小的元素,需要进行运算符重载
此算法寻找源点到与它连接的所有顶点的最短路径
运算符重载:
struct Node {int u, step;Node() {};Node(int a, int sp) {u = a; step = sp;//u为顶点,step为源点到顶点u的最短路径 }bool operator < (const Node& a)const { // 重载 <return step > a.step;}
};
注意这样重载以后operator<为成员函数,再用pop出队时首先出的是step最小的结点
总代码:
#include <iostream>
#include<cstring>
#include<queue>
#include<algorithm>
#include<windows.h>
#define INF 0x7fffffff
const int N = 100; // 城市的个数可修改int map[N][N], dist[N], n, m;
int flag[N];
struct Node {int u, step;Node() {};Node(int a, int sp) {u = a; step = sp;}bool operator < (const Node& a)const { // 重载 <return step > a.step;}
};
void Dijkstra(int st) {priority_queue <Node> Q; // 优先队列优化Q.push(Node(st, 0));memset(flag, 0, sizeof(flag));//初始化flag数组为0for (int i = 1; i <= n; ++i)dist[i] = INF; // 初始化所有距离为,无穷大dist[st] = 0;while (!Q.empty()){Node it = Q.top();//优先队列队头元素为最小值Q.pop();int t = it.u;if (flag[t])//说明已经找到了最短距离,该结点是队列里面的重复元素continue;flag[t] = 1;for (int i = 1; i <= n; i++){if (!flag[i] && map[t][i] < INF) { // 判断与当前点有关系的点,并且自己不能到自己if (dist[i] > dist[t] + map[t][i]){ // 求距离当前点的每个点的最短距离,进行松弛操作dist[i] = dist[t] + map[t][i];Q.push(Node(i, dist[i]));// 把更新后的最短距离压入优先队列,注意:里面的元素有重复}}}}
}
int main(){int u, v, w, st;system("color 0d");//设置背景及字体颜色cout << "请输入城市的个数:" << endl;cin >> n;cout << "请输入城市之间的路线的个数:" << endl;cin >> m;for (int i = 1; i <= n; i++)//初始化图的邻接矩阵for (int j = 1; j <= n; j++){map[i][j] = INF;//初始化邻接矩阵为无穷大}cout << "请输入城市之间u,v的路线以及距离w:" << endl;while (m--){cin >> u >> v >> w;map[u][v] = min(map[u][v], w); //邻接矩阵储存,保留最小的距离}cout << "请输入小明所在的位置:" << endl; ;cin >> st;Dijkstra(st);cout << "小明所在的位置:" << st << endl;for (int i = 1; i <= n; i++){cout << "小明:" << st << "--->" << "要去的位置:" << i;if (dist[i] == INF)cout << "sorry,无路可达" << endl;elsecout << " 最短距离为:" << dist[i] << endl;}return 0;
}
注意这个:
if (flag[t])//说明已经找到了最短距离,该结点是队列里面的重复元素
continue;
已经找到了从源点到t的最短距离,结束此轮循环,开始下一轮循环,出队Q的下一个顶点,寻找源点到下一个顶点的最小路径
摘录自书籍【趣学算法】第2.5节
【算法学习笔记】 图(四)用优先级队列优化Dijkstra算法求最短路径(邻接矩阵存储)相关推荐
- 基于MVS的三维重建算法学习笔记(四)— 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读
基于MVS的三维重建算法学习笔记(四)- 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读 声明 SGM概述 Cost Calculation(像素代价计算)--M ...
- 数据结构与算法学习笔记——图 C++实现
数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...
- STL学习笔记-priority quene容器(优先级队列)
简介: 按照值的大小决定出队列的顺序:最大值优先队列.最小值优先队列 默认是最大值优先级队列 头文件: #include<quene> 定义优先级: priority_quene<i ...
- 数据结构与算法学习笔记——图(Graph)
什么是图: 无向图:可以理解QQ中的互加好友 无向图: 可以理解为微博中的关注 图的一些概念: 顶点:图中的元素(A,B,C,D....) 边: 图中的一个顶点可以与任意其他顶点建立连接关系,这种建立 ...
- MongoDB学习笔记(四)--索引 性能优化
索引 基础索引 ...
- 图解算法学习笔记(四):快速排序
目录 1) 示例1: 2)快速排序 3) 再谈大O表示法 4)小结 本章内容:学习分而治之,快速排序 1) 示例1: 假设你是农场主,有一小块土地,你要将这块地均匀分成方块,且分出的方块尽可能大.如何 ...
- 邓俊辉数据结构与算法学习笔记-第四章
文章目录 栈和队列 a 栈的接口与实现 a1 栈 a2 实例 a3 实现 c c1-1 栈的典型应用 c1-2 进制转换算法 c1-3实现 c2-1括号匹配实例 c2-2 尝试 c2-3 构思 c2- ...
- 《统计学习方法》算法学习笔记(四)之 决策树(上)
决策树 总述 决策树是一种基本的分类与回归方法,本节主要讨论用于分类的决策树.决策树呈树状结构,在分类问题中,表示基于特征对实例进行分类的过程.它可以认为是if-then规则的集合,也可以认为是定义在 ...
- 图解算法学习笔记(七):狄克斯特拉算法
目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...
最新文章
- mysql $区别_mysql 与oracle区别
- 完全卸载SQL Server 2008 R2(转)
- 2020-2021Android中高级面试题大全
- python报错:ImportError: cannot import name autojit from numba(无法导入numba.autojit)
- Sales Organization with Fiscal Year
- 还是畅通工程(HDU-1233)
- CECC2018赛季收官站我国×××手夺得年度总冠军
- 万字长文!剖析美团外卖持续交付的前世今生
- wincc怎么做数据库_wincc 数据库
- LINUX中注销其他已登陆帐户
- 超详细汇总21个mysql优化实践【收藏版MySQL优化】
- 2021高考河北省艺术类成绩查询,2021河北省艺术类高考专业考试成绩有关规定
- php 上标,PHP数组上标类型陷阱
- 全国大学生电子设计竞赛 控制类赛题分析
- 一些微信小程序demo地址记录分享
- PPT设置自动保存时间 mac_第17期分享:如何控制PPT演讲汇报时间?
- python实现葵花8号(Himawari-8)的WLF数据自动下载与数据库导入
- Duplicated tag: ‘dependencies‘报错
- TaoFramework
- PS一键制作针织毛衣纹理图案效果
热门文章
- mysql 字符串不限长度,mysql中的字符串长度是否有限制?
- nio java 内核拷贝_大文件拷贝,试试NIO的内存映射
- maven 打包时缺少文件_(三)Java资源文件和路径相关扫盲
- c mysql批量添加数据类型_mybatis学习之路----mysql批量新增数据
- 固态硬盘量产工具_机械硬盘Q1出货量大降,电脑硬盘榜单出炉
- php输出0到5之间到数,php如何实现输出链表倒数第k个结点(代码实例)
- 三十一、Scrapy爬取百度图片
- 2020-2-15技术积累-时间插件-前端获取后端数据生成表格
- 博士申请 | 香港科技大学陈浩教授招收AI医疗方向全奖博士/博后/实习生
- CVPR 2022 | CNN自监督预训练新SOTA:上交、Mila、字节联合提出具有层级结构的图像表征自学习新框架...