优先级队列: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算法求最短路径(邻接矩阵存储)相关推荐

  1. 基于MVS的三维重建算法学习笔记(四)— 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读

    基于MVS的三维重建算法学习笔记(四)- 立体匹配经典算法Semi-Global Matching(SGM)论文翻译及要点解读 声明 SGM概述 Cost Calculation(像素代价计算)--M ...

  2. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

  3. STL学习笔记-priority quene容器(优先级队列)

    简介: 按照值的大小决定出队列的顺序:最大值优先队列.最小值优先队列 默认是最大值优先级队列 头文件: #include<quene> 定义优先级: priority_quene<i ...

  4. 数据结构与算法学习笔记——图(Graph)

    什么是图: 无向图:可以理解QQ中的互加好友 无向图: 可以理解为微博中的关注 图的一些概念: 顶点:图中的元素(A,B,C,D....) 边: 图中的一个顶点可以与任意其他顶点建立连接关系,这种建立 ...

  5. MongoDB学习笔记(四)--索引 性能优化

    索引                                                                                             基础索引 ...

  6. 图解算法学习笔记(四):快速排序

    目录 1) 示例1: 2)快速排序 3) 再谈大O表示法 4)小结 本章内容:学习分而治之,快速排序 1) 示例1: 假设你是农场主,有一小块土地,你要将这块地均匀分成方块,且分出的方块尽可能大.如何 ...

  7. 邓俊辉数据结构与算法学习笔记-第四章

    文章目录 栈和队列 a 栈的接口与实现 a1 栈 a2 实例 a3 实现 c c1-1 栈的典型应用 c1-2 进制转换算法 c1-3实现 c2-1括号匹配实例 c2-2 尝试 c2-3 构思 c2- ...

  8. 《统计学习方法》算法学习笔记(四)之 决策树(上)

    决策树 总述 决策树是一种基本的分类与回归方法,本节主要讨论用于分类的决策树.决策树呈树状结构,在分类问题中,表示基于特征对实例进行分类的过程.它可以认为是if-then规则的集合,也可以认为是定义在 ...

  9. 图解算法学习笔记(七):狄克斯特拉算法

    目录 1)使用狄克斯特拉算法 2)术语 3)实现 4)小结 本章内容; 介绍加权图,提高或降低某些边的权重: 介绍狄克斯特拉算法,找出加权图中前往X的最短路径: 介绍图中的环,它导致狄克斯特拉算法不管 ...

最新文章

  1. mysql $区别_mysql 与oracle区别
  2. 完全卸载SQL Server 2008 R2(转)
  3. 2020-2021Android中高级面试题大全
  4. python报错:ImportError: cannot import name autojit from numba(无法导入numba.autojit)
  5. Sales Organization with Fiscal Year
  6. 还是畅通工程(HDU-1233)
  7. CECC2018赛季收官站我国×××手夺得年度总冠军
  8. 万字长文!剖析美团外卖持续交付的前世今生
  9. wincc怎么做数据库_wincc 数据库
  10. LINUX中注销其他已登陆帐户
  11. 超详细汇总21个mysql优化实践【收藏版MySQL优化】
  12. 2021高考河北省艺术类成绩查询,2021河北省艺术类高考专业考试成绩有关规定
  13. php 上标,PHP数组上标类型陷阱
  14. 全国大学生电子设计竞赛 控制类赛题分析
  15. 一些微信小程序demo地址记录分享
  16. PPT设置自动保存时间 mac_第17期分享:如何控制PPT演讲汇报时间?
  17. python实现葵花8号(Himawari-8)的WLF数据自动下载与数据库导入
  18. Duplicated tag: ‘dependencies‘报错
  19. TaoFramework
  20. PS一键制作针织毛衣纹理图案效果

热门文章

  1. mysql 字符串不限长度,mysql中的字符串长度是否有限制?
  2. nio java 内核拷贝_大文件拷贝,试试NIO的内存映射
  3. maven 打包时缺少文件_(三)Java资源文件和路径相关扫盲
  4. c mysql批量添加数据类型_mybatis学习之路----mysql批量新增数据
  5. 固态硬盘量产工具_机械硬盘Q1出货量大降,电脑硬盘榜单出炉
  6. php输出0到5之间到数,php如何实现输出链表倒数第k个结点(代码实例)
  7. 三十一、Scrapy爬取百度图片
  8. 2020-2-15技术积累-时间插件-前端获取后端数据生成表格
  9. 博士申请 | 香港科技大学陈浩教授招收AI医疗方向全奖博士/博后/实习生
  10. CVPR 2022 | CNN自监督预训练新SOTA:上交、Mila、字节联合提出具有层级结构的图像表征自学习新框架...