Dijkstra + 堆优化
Dijkstra算法原理请见:最短路径问题(Dijkstra解法)
该算法对于稠密图更加有效:
对于给出具有非负权重的边和源顶点S的图G,算法可在O(mlogn)时间内找出从s点到其他每一个顶点的距离。
如果图是稠密的,即对于某个ε>0,m>=n^(1+ε),可以被改善在O(m/ε)内执行。(m为图的边数,n为图的定点数)
最小堆模板:
- struct HeapElement {
- // key存储顶点序号,value存储到该顶点的最短距离
- int key, value;
- };
- struct MinHeap {
- HeapElement heap[MAXN];
- int position[MAXN];
- int size; // 顶点数
- void init() {
- heap[size=0].value = -INF;
- memset(position, 0, sizeof(position));
- }
- void insert(int key, int value) {
- heap[++size].key = key;
- heap[size].value = value;
- position[key] = size;
- siftUp(size);
- }
- void decrease(int index) {
- int x = heap[index].value;
- int y = heap[size].value;
- -- size;
- if (index == size+1)
- return;
- swap(heap[index], heap[size+1]);
- if (y >= x) {
- siftDown(index);
- } else {
- siftUp(index);
- }
- }
- int delmin() {
- int x = heap[1].key;
- decrease(1);
- return x;
- }
- void siftUp(int index) {
- while (index > 1) {
- if (heap[index].value < heap[index/2].value) {
- swap(heap[index],heap[index/2]);
- } else {
- break;
- }
- index /= 2;
- }
- }
- void siftDown(int index) {
- while (index*2 <= size) {
- index *= 2;
- if (index < size && heap[index].value > heap[index+1].value) {
- ++ index;
- }
- if (heap[index].value < heap[index/2].value) {
- swap(heap[index],heap[index/2]);
- } else {
- break;
- }
- }
- }
- void makeHeap() {
- for (int i = size/2; i > 0; -- i)
- siftDown(i);
- }
- void swap(HeapElement &a, HeapElement &b) {
- HeapElement temp = a;
- a = b;
- b = temp;
- int tmp = position[a.key];
- position[a.key] = position[b.key];
- position[b.key] = tmp;
- }
- }H;
代码实现:(hdu2544)
- #include <iostream>
- #define INF 0x7FFFFFFF
- using namespace std;
- const int SIZE = 105;
- int dist[SIZE];
- int G[SIZE][SIZE];
- bool vis[SIZE];
- struct HeapElement {
- int key, value;
- };
- void swap(HeapElement &ha, HeapElement &hb) {
- int key = ha.key;
- int value = ha.value;
- ha.key = hb.key;
- ha.value = hb.value;
- hb.key = key;
- hb.value = value;
- };
- // 使用邻接表储存图,线性表储存堆
- struct MinHeap {
- HeapElement heap[SIZE];
- int n; // 顶点数
- void makeheap() {
- for (int i = n/2; i > 0; -- i)
- siftDown(i);
- };
- void siftUp(int index) {
- int k = index;
- while (k > 1) {
- if (heap[k].value < heap[k/2].value) {
- swap(heap[k],heap[k/2]);
- } else {
- break;
- }
- k /= 2;
- }
- };
- void siftDown(int index) {
- int k = index;
- while (k*2 <= n) {
- k *= 2;
- if (k < n && heap[k].value > heap[k+1].value) {
- ++ k;
- }
- if (heap[k].value < heap[k/2].value) {
- swap(heap[k],heap[k/2]);
- } else {
- break;
- }
- }
- };
- void insert(HeapElement element) {
- heap[++n] = element;
- siftUp(n);
- };
- void decrease(int index) {
- int x = heap[index].value;
- int y = heap[n].value;
- n -= 1;
- // 若删除节点位于最末位置,则删除成功,无需其他操作。
- if (index == n+1)
- return;
- heap[index] = heap[n+1];
- if (y >= x) {
- siftDown(index);
- } else {
- siftUp(index);
- }
- };
- int decreaseMin() {
- int x = heap[1].key;
- decrease(1);
- return x;
- };
- }H;
- void dijkstra(int src, int n) {
- int i, j, w;
- bool flag;
- for (i = 1; i <= n; ++ i) {
- if (G[i][src] != INF) {
- dist[i] = G[src][i];
- HeapElement h = {i, dist[i]};
- H.insert(h);
- } else {
- dist[i] = INF;
- }
- }
- memset(vis, false, sizeof(vis));
- vis[src] = true;
- dist[src] = 0;
- for (i = 1; i < n; ++ i) {
- int node = H.decreaseMin();
- vis[node] = true;
- for (w = 1; w <= n; ++ w) {
- flag = false;
- if (!vis[w] && G[node][w] != INF) {
- if (dist[node] < dist[w] - G[node][w]) {
- dist[w] = dist[node] + G[node][w];
- }
- for (j = 1; j <= H.n; ++ j) {
- if (H.heap[j].key == w) {
- H.heap[j].value = dist[w];
- flag = true;
- break;
- }
- }
- if (!flag) {
- HeapElement h = {w, dist[w]};
- H.insert(h);
- } else {
- H.siftUp(j);
- }
- }
- }
- }
- };
- void init(int n) {
- for (int i = 1; i <= n; ++ i)
- for (int j = 1; j <= n; ++ j)
- G[i][j] = INF;
- H.n = 0;
- };
- int main()
- {
- int N, M, a, b, c;
- //freopen("C:\\Users\\Smile\\test.txt","r",stdin);
- //freopen("C:\\Users\\Smile\\out.txt", "w", stdout);
- while (scanf("%d%d",&N,&M)!=EOF, N&&M) {
- init(N);
- for (int i = 0; i < M; ++ i) {
- scanf("%d%d%d",&a,&b,&c);
- if (G[a][b] > c) {
- G[a][b] = c;
- G[b][a] = c;
- }
- }
- dijkstra(1, N);
- printf("%d\n",dist[N]);
- }
- }
Dijkstra + 堆优化相关推荐
- dijkstra堆优化(multiset实现-大大减小代码量)
例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...
- A - Age of Moyu HDU - 6386(Dijkstra+堆优化)
要解决这道题,可以用dfs+bfs,但是我不会,所以我只会dijkstra算法: 要解决这道题必须明白迪杰斯特拉算法的核心思想,我是这样理解的: 我可以任意举例一个图: 比如这个图,那么求1-6的最短 ...
- * Dijkstra 堆优化
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/Mashiro_ylb/article/ ...
- poj1511 InvitationCards 最短路 Dijkstra堆优化
第一反应想到和 poj3268做法一样,先是从起点dj,然后将图反向,再次dj一次,求和即可.但是,数据O(n*n)过不去,所以需要使用dijkstra的堆优化! 淦,没用scanf结果超时了= = ...
- 寒假集训 最短路(I - Heavy Transportation)dijkstra+堆优化
今天的集训学习了最短路dijkstra的堆优化,把时间复杂度从朴素版的O()降至了O(n*logn+m). 首先,先上一段朴素版的代码. void dijkstra() {dist[1] = 0;fo ...
- dijkstra+堆优化
分析: 可知Dijkstra算法的复杂度是O(n*n) Dijkstra算法在寻找集合T中距离最小的顶点W(即寻找dist数组中最小值)复杂度是O(n),在更新距离操作时复杂度为O(n). 上述操作需 ...
- HDU-6290 奢侈的旅行 2018女赛 Dijkstra堆优化
又因为cost=log2∗((level+ai)/level)cost=log2*((level+a_i)/level)cost=log2∗((level+ai)/level),cost会带着log ...
- * poj 3159 Candies 最短路 dijkstra堆优化
题意: n个人,m个信息,每行的信息是3个数字,A,B,C,表示B比A多出来的糖果不超过C个,问你,n号人最多比1号人多几个糖果 Input: 输入包含单个测试用例.测试用例以两个整数n和m开头,分别 ...
- HDU ACM 3986 Harry Potter and the Final Battle(邻接表实现最短路dijkstra堆优化记录路径 + 枚举最短路上每条边)...
http://acm.hdu.edu.cn/showproblem.php?pid=3986 题意: 从起点1 到 终点n,删除图中任意一条边求最短路的最坏情况. n --表示有n个点 m --边数 ...
- dijkstra算法及其堆优化
dijkstra算法及其堆优化 (个人笔记写给自己看的) 数据结构:链式前向星,优先队列 dijkstra算法: vis数组初始化为0,dis数组初始化为inf(很大的值如:0x7fffffff),设 ...
最新文章
- POJ1149-PIGS
- Matlab学习笔记——find()函数
- numpy中的matrix矩阵处理
- (转)使用异步 I/O 大大提高应用程序的性能
- 【python教程入门学习】python入门:来来来,每天10点定时签到拿京豆啦
- 和最大子序列(dp)
- HIVE 的笛卡尔积on无条件
- paip.提升性能---list,arraylist,vector,linkedlist,map的选用..
- Marked.js让您的文档编辑更加轻松自如!
- 为什么大数据与云计算密不可分?
- 「GoTeam 招聘时间」滴滴出行系统研发工程师(北京)
- 30系列显卡安装深度学习pytorch坏境
- 阅读《工业革命》有感——福(氟)到了
- hadoop直接解压hdfs中的zip文件
- 五部超燃科幻电影,九成没有全部看过
- 前端对浏览器性能优化
- java 一维码架包_Java 生成、识别条形码
- Linux 23年来的发展历史
- 【数据结构】——平衡二叉树(AVL树)
- 伯恩PAC人格结构理论(转载)
热门文章
- Zookeeper,Hbase 伪分布,集群搭建
- [置顶] javascript中的数组对象以及json学习笔记
- python调用接口获取文件_Python中做接口自动化如何读取配置ini文件
- python语言程序设计编程题_《python语言程序设计》_第二章编程题
- mysql数据库官网怎么下载安装_MySQL数据库的下载与安装
- mysql 8.0安装_MySQL5.7升级到8.0过程详解
- 细粒度图像分类_【完结】16篇图像分类干货文章总结,从理论到实践全流程大盘点!...
- java 数据流 中文_【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-wi...
- JMETER安装中遇到的问题(not able to find Java executable or version.Please check your java installation)
- python爬取拉勾网职位信息_Python爬虫:拉勾网Python的职位信息爬取