/*
7 10
1 2 2
1 3 5
2 3 4
3 4 2
2 4 6
4 6 1
2 5 10
5 6 3
5 7 5
6 7 9
0 2 5 7 12 8 17
*/
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int MAX_V=10005;
const int INF=0x3f3f3f;
struct edge{int to;//边的终点 int cost;//权值edge(int t,int c){to=t;cost=c;}
};
typedef pair<int,int> P;//first是该点入队时的最短距离,second是顶点编号
int V;//顶点数
int E;//边数
vector<edge> G[MAX_V];
int d[MAX_V];void read(){int start,to,cost;scanf("%d%d",&V,&E);for(int i=0;i<E;i++){scanf("%d%d%d",&start,&to,&cost);G[start].push_back(edge(to,cost));}
}
void dijkstra(int s){//通过指定greater<P>参数,堆按照first从小到大的顺序取出值priority_queue<P,vector<P>,greater<P> > que;//优先队列里存的都是最短距离已经确认的顶点 /*priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数:priority_queue<Type, Container, Functional>其中Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。如果要用到小顶堆,则一般要把模板的三个参数都带进去。STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆p1 < p2;  两个pair对象间的小于运算,其定义遵循字典次序:如 p1.first < p2.first 或者 !(p2.first < p1.first) && (p1.second < p2.second) 则返回true。pair详解 转https://blog.csdn.net/sevenjoin/article/details/81937695*/fill(d,d+V+1,INF);d[s]=0;que.push(P(0,s));//起点,起点到起点的最短距离是确定的(0) while(!que.empty()){P p=que.top();que.pop();//每次取出容器中已经确定的离起点最近的点 //printf("取出点%d\n",p.second); int v=p.second;if(d[v]<p.first)continue;//表示该点入队不只一次(即之前有多个点都可以到达它),那么d[v]也可能更新了不只一次,//而每次更新都会使d[v]更小,显然这个p.first是其中一次更新,但不是最小的那个,而最小的//那个在此之前就出队了,所以不必再用这条记录继续往下更新了 /*这里是队的取出情况 取出点1d[2]:4144959>d[1]:0+1_to_2_cost:2       更新d[2]为2     2入队d[3]:4144959>d[1]:0+1_to_3_cost:5       更新d[3]为5     3入队取出点2d[4]:4144959>d[2]:2+2_to_4_cost:6       更新d[4]为8     4入队d[5]:4144959>d[2]:2+2_to_5_cost:10      更新d[5]为12    5入队取出点3d[4]:8>d[3]:5+3_to_4_cost:2             更新d[4]为7     4入队取出点4  这个是P(7,4) d[6]:4144959>d[4]:7+4_to_6_cost:1       更新d[6]为8     6入队取出点4  这个是P(8,4),而d[4]已经在第65行时被更新为7<p.first:8 所以continue 取出点6d[7]:4144959>d[6]:8+6_to_7_cost:9       更新d[7]为17    7入队取出点5取出点7*/for(int i=0;i<G[v].size();i++){//扫描其所有相邻的顶点,并更新他们的最短距离d[i] edge e=G[v][i];if(d[e.to]>d[v]+e.cost){//printf("d[%d]:%d>d[%d]:%d+%d_to_%d_cost:%d\t更新d[%d]为%d\t%d入队\n",e.to,d[e.to],v,d[v],v,e.to,e.cost,e.to,d[v]+e.cost,e.to);d[e.to]=d[v]+e.cost;//d[v]是已经确定的que.push(P(d[e.to],e.to));//更新后最短距离已经确认的点入队,优先队列里自动维护,队头是最小的那个 }} }
}
int main(){read();dijkstra(1);for(int i=1;i<=V;i++)printf("%d ",d[i]);return 0;
}

优先队列——最短路径相关推荐

  1. 最短路径Dijkstra(静态邻接表+优先队列模板)+ 记忆化搜索

    这道题的解题步骤是这样的: (1)用Dijkstra求出每个点到house(也就是2号点)的最短距离,我是记录在数组dist[]中: (2)我们要求的是office(1号点)到house(或2--&g ...

  2. 贪心算法之用优先队列解决最短路径问题(Dijkstra算法)

    1.问题 最短路径问题(Dijkstra算法)用 优先队列实现,问题描述和分析和优先队列先看前面我的几篇博客 贪心算法之最短路径问题(Dijkstra算法) C++之STL之priority_queu ...

  3. dijkstra--非负权值的单源最短路径STL实现(邻接表+优先队列) (带路径)

    一.预备知识: 用优先队列做大小根堆 注意:是非负权值的单源最短路径的STL实现,权值是负的不能用dijkstra算法 解释在第一段 二.代码: #include<iostream> #i ...

  4. 单源最短路径-分支限界法-优先队列式分支限界法-Dijkstra

    问题描述: 给定一个带权有向图G = (V, E), 其中每条边的权是非负实数.另外,还给定V中的一个顶点,称为源.现在要计算源到所有其他各定点的最短长度.这里路的长度是指路上各边权之和.这个问题通常 ...

  5. 单源最短路径 Dijkstra+优先队列

    用优先队列优化的Dijkstra 1找到最短距离已经确认的顶点,从它出发更新相邻顶点的最短距离 2此后不需要关心1中的"最短距离已经确认的顶点" 堆中元素共有O(V)个,更新和取出 ...

  6. bfs(图的最短路径)+优先队列 (2021-8-9)

    刺客信条 题意 小A就将操控艾吉奥从佛罗伦萨庄园出发,前往梵蒂冈,夺取教皇权杖. 在整个过程中,每经过一个建筑,都需要花费一定的时间,需要特别注意的是,由于圣母百花大教堂.圣马可大教堂.乔托钟楼都有众 ...

  7. java有向图最短路径_单源最短路径之Java实现(使用Java内置优先队列)

    import java.util.*; /** * 用堆实现了从一个点到其他点的最短路径 * @author 李赫元 */ public class ShortestPath { /**有n个节点*/ ...

  8. ntu 课程笔记 :MAS714(7) 最短路径和优先队列

    DFS & BFS_UQI-LIUWJ的博客-CSDN博客 中所说的图的遍历问题 1.2 naive shortest path 1.2.1 铺垫 BFS通过和源节点之间的距离,一层一层地向外 ...

  9. C++实现dijkstra单源最短路径算法-邻接表+优先队列

    dijkstra单源最短路径算法不允许边权值为负,适用的图范围可以很大. 代码如下: #include <iostream> #include <queue> #include ...

最新文章

  1. 实现搜索框记录搜索历史_三个案例告诉你:“搜索框”该如何设计?
  2. 利用MAC OS X 自带的磁盘工具提取光盘镜像ISO文件
  3. python3统一为什么类型_Python3 基本数据类型
  4. 雷柏鼠标怎么配对接收器_四款蓝牙鼠标的详细使用体验对比
  5. C语言经典例100-将学生成绩写入文件
  6. ACM竞赛学习整理开篇之01背包问题
  7. 消息队列——发布订阅模式
  8. 模拟手机QQ滑动删除消息
  9. mysql 自动递增值归零_修改MySQL自动递增值
  10. java 内部类序列化_Gson如何序列化内部类
  11. 异常:System.BadImageFormatException,未能加载正确的程序集XXX
  12. 《赢道——成功创业者的28条戒律》2009年1月出版
  13. Request 对象
  14. c语言课程设计--太空战机,基于Funcode平台的软件课程设计
  15. 全新卡盟系统PHP版 集成易支付_PHP全新授权系统支持盗版入库卡密授权
  16. 数据分析案例-航空公司客户价值分析(聚类)
  17. 计算机一级网络题连接网络,计算机一级MSOffice模拟试题及答案
  18. SANGFOR深信服远程办公客户端EasyConnect在Windows11使用兼容性问题解决案例
  19. 世界顶级黑客,都有哪些神仙操作?这篇文章带你了解一下!
  20. 采用analysis-dynamic-synonym插件,动态文件的方式同步同义词

热门文章

  1. 乔布斯斯坦福演讲---找到你的钟爱
  2. 小米电视4A升级桌面太卡怎么办
  3. Microsoft Excel不能访问文件,不能保存,不能单击打开文件的解决方法
  4. java入门(七) | 循环结构
  5. 一个整数,个位是4,把4移动到首位,则变为原来4倍,那么这个数是?
  6. 【聊天机器人】NLP知识
  7. 第六章面向对象(2)
  8. Java正则表达式(一)、抓取网页email地址实例
  9. u盘版linux initramfs,探索Linux系统的启动过程
  10. 运行ssd300报错UserWarning: volatile was removed and now has no effect