Dijkstra算法2
- // 再来一手精髓的Dijkstra
- // 复杂度O( E*log(V) )
- #include <cstdio>
- #include <iostream>
- #include <vector>
- #include <queue>
- using namespace std;
- const int max_N = +;
- const int max_E = +;
- const int INF = 1e9;
- int N,E;
- int d[max_N];
- // 来自何方,已经不重要了。
- // 实际上是在邻接表实现的过程中,行号即为来自的顶点
- struct edge
- {
- int to,cost;
- };
- // P.first代表距离,P.second代表顶点编号
- typedef pair<int,int> P;
- vector<edge> G[max_N];
- // 这一个算法下来,我们在数组d中得到了从s点到其余所有顶点的最短路程
- void dijkstra(int s)
- {
- // 建立最堆,来维护最小距离,可以降低一层复杂度
- priority_queue< P,vector<P>,greater<P> > que;
- fill(d,d+N,INF);
- d[s]=;
- que.push(P(,s));
- while(!que.empty())
- {
- // 取出一个顶点,看是否是Dijstra算法中,已经确定的最小顶点
- P p=que.top();
- que.pop();
- int v=p.second;
- // 让我们来看看这一步
- // 首先,每次取出堆中的最小元素
- // 然后去检索这个堆顶元素的标号所对应的距离
- // 咦,你会发现堆顶这个距离,竟然比取出的最小元素还要小
- // 惊讶?难道出错了?没有,考虑Dijkstra算法的流程,这个顶点肯定是之前已经确定过的最小顶点了,不需要考虑
- // 之前的实现是多加了一个flag数组来标记,这里可以省去这部分内存,直接用这个条件来判断
- if(d[v]<p.first)
- {
- continue;
- }
- for(int i=;i<G[v].size();++i)
- {
- edge e=G[v][i];
- if(d[e.to] > d[v] + e.cost)
- {
- d[e.to]=d[v]+e.cost;
- // 数组中维护此次被更新的节点即可,其余节点不需要维护
- que.push(P(d[e.to],e.to));
- }
- }
- }
- }
- int main()
- {
- int a,b,c;
- scanf("%d %d",&N,&E);
- for(int i=;i<E;++i)
- {
- scanf("%d %d %d",&a,&b,&c);
- edge e;
- e.to=b;
- e.cost=c;
- G[a].push_back(e);
- // 无向图
- e.to=a;
- e.cost=c;
- G[b].push_back(e);
- }
- dijkstra();
- for(int i=;i<N;++i)
- {
- printf("%d ",d[i]);
- }
- return ;
- }
- /*
- 7 10
- 0 1 2
- 0 2 5
- 1 2 4
- 1 3 6
- 1 4 10
- 2 3 2
- 3 5 1
- 4 5 3
- 4 6 5
- 5 6 9
- */
Dijkstra算法2的更多相关文章
- 求两点之间最短路径-Dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.D ...
- Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解
/* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...
- 关于dijkstra算法的一点理解
最近在准备ccf,各种补算法,图的算法基本差不多看了一遍.今天看的是Dijkstra算法,这个算法有点难理解,如果不深入想的话想要搞明白还是不容易的.弄了一个晚自习,先看书大致明白了原理,就根据书上的 ...
- 最短路模板(Dijkstra & Dijkstra算法+堆优化 & bellman_ford & 单源最短路SPFA)
关于几个的区别和联系:http://www.cnblogs.com/zswbky/p/5432353.html d.每组的第一行是三个整数T,S和D,表示有T条路,和草儿家相邻的城市的有S个(草儿家到 ...
- Dijkstra算法(二)之 C++详解
本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...
- Dijkstra算法(一)之 C语言详解
本章介绍迪杰斯特拉算法.和以往一样,本文会先对迪杰斯特拉算法的理论论知识进行介绍,然后给出C语言的实现.后续再分别给出C++和Java版本的实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法 ...
- 最短路问题Dijkstra算法
Dijkstra算法可以解决源点到任意点的最短距离并输出最短路径 准备: 建立一个距离数组d[ n ],记录每个点到源点的距离是多少 建立一个访问数组v[ n ],记录每个点是否被访问到 建立一个祖先 ...
- dijkstra算法求最短路
艾兹格·W·迪科斯彻 (Edsger Wybe Dijkstra,1930年5月11日~2002年8月6日)荷兰人. 计算机科学家,毕业就职于荷兰Leiden大学,早年钻研物理及数学,而后转为计算学. ...
- 数据结构之Dijkstra算法
基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求 ...
- ACM: HDU 1869 六度分离-Dijkstra算法
HDU 1869六度分离 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Descri ...
随机推荐
- Isx个人第4次作业—Alpha项目测试
标题 内容 这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/GeographicInformationScience 这个作业要求在哪里 https:// ...
- 如何从Serilog请求日志记录中排除健康检查终结点
这是在ASP.NET Core 3.X中使用Serilog.AspNetCore系列文章的第四篇文章:. 第1部分-使用Serilog RequestLogging减少日志详细程度 第2部分-使用Se ...
- React 解析/ 第二节 使用 Reac
官方脚手架 create-react-app React 提供了一个官方的命令行工具(CLI)—— create-react-app,是专门用于快速搭建单页面应用(SPA)的脚手架,它基于 Webpa ...
- 1759: 学生信息插入(武汉科技大学结构体oj)(已AC)
#include<stdio.h>struct student { long no; char name[9]; int score;} t;void input(struct stude ...
- PE可执行文件加载器
PE文件加载器 模仿操作系统,加载pe文件到内存中 该项目主要是为了检测pe的学习程度,是否都完全理解了.当然没有完全理解 实现功能的如下: 模仿操作系统,加载pe文件到内存中,然后执行待执行的pe文 ...
- OpenStack之虚拟机热迁移
这里的环境是centos7版本,openstack K版 1.在各个计算节点设置权限 chmod /var/lib/nova/instances 2.修改各个节点的nova.conf(/etc/nov ...
- 使用html及CSS实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部:
使用html及CSS实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部: <!DOCTYPE html><html lang="en">< ...
- 使用脚本+kafka自带命令行工具 统计数据写入kafka速率
思路 每隔一段时间(比如说10秒)统计一次某topic的所有partition的最大offset值之和,这便是该topic的message总数. 然后除以间隔时间就可以粗略但方便得出 某topic的数 ...
- BZOJ 1046 [HAOI2007]上升序列(LIS + 贪心)
题意: m次询问,问下标最小字典序的长度为x的LIS是什么 n<=10000, m<=1000 思路: 先nlogn求出f[i]为以a[i]开头的LIS长度 然后贪心即可,复杂度nm 我们 ...
- 一起了解 .Net Foundation 项目 No.2
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. ASP.NET MVC, ...