Dijkstra是一个非常不错的最短路算法,它使用两层循环进行枚举,通过每次更新蓝白点的方式更新最短路,时间复杂度为O(n^2),优于floyd的O(n^3),不过只能用于计算单源最短路,而且无法处理负权边。

今天我们尝试用堆来优化它。这里我们使用了STL中的set和pair。set本身相当于一个小根堆,内部自动从小到大排序。(据说内部使用平衡树实现?蒟蒻瑟瑟发抖。)操作方式大致就是insert(插入)和erase(删除),不过他会把相同的数据融合到一起,如果不想这样可以使用multiset。对于堆的遍历我们不能像数组一样直接遍历,而是要使用迭代器。(用法下面代码有)而pair相当于一个有两个成员的且已经重定义的struct,使用makepair来新构造一个pair。

具体怎么做呢?我们从起点出发,然后枚举每一条能走到的边(这里使用了邻接表存图),之后在选取最短的一条边时,我们使用堆即可,也就是将贪心变成了堆,这样时间复杂度就变为了O(nlogn)。

直接上代码看一下就好啦!

#include<cstdio>
#include<vector>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<set>
#include<map>
#include<queue>
#define mp make_pair
#define fi first
#define sc second
#define faker(i,a,n) for(int i = a;i <= n;i++)
#define duke(i,n,a) for(int i = n;i >= a;i--)
const int M = ;
int v[M],num,next[M],head[M],cost[M],dis[M];
bool vis[M];
int n,m,x,y,z;
using namespace std;
typedef pair<int,int> pr;//pair等于有两个成员且已经重定义的struct
void add(int x,int y,int z)//邻接表存图
{
v[++num] = y;
next[num] = head[x];
cost[num] = z;
head[x] = num;
}
int read()
{
int num = ;
char ch,last = ' ';
ch = getchar();
while(ch < '' || ch > '')
{
if(ch == '-') last = ch;
ch = getchar();
}
while(ch >= '' && ch <= '')
{
ans *= ;
ans += ch - '';
ch = getchar();
}
if(last == '-') ans = -ans;
return ans;
}
set<pr> q;//定义一个堆
set<pr> :: iterator it;//迭代器定义
int main()
{
n = read(),m = read();
faker(i,,m)//循环(不要问我为什么有这么奇怪的名字)
{
x = read(),y = read(),z = read();
add(x,y,z);
}
faker(i,,n) dis[i] = ;
dis[] = ;
q.insert(mp(dis[],));//将起点压入堆
faker(i,,n) vis[i] = ;
while(!q.empty())
{
pr u = *(q.begin());
q.erase(q.begin());//删除堆顶元素
vis[u.sc] = ;//设置为走过
for(int i = head[u.sc];i;i = next[i])
{
if(dis[v[i]] > dis[u.sc] + cost[i])
{
it = q.find(mp(dis[v[i]],v[i]));
if(it != q.end())q.erase(it);//将当前较长的路径删除
dis[v[i]] = dis[u.sc] + cost[i];//更新距离
q.insert(mp(dis[v[i]],v[i]));//更新 ,压入更短的路径
}
}
}
return ;
}

Dijkstra堆优化的更多相关文章

  1. POJ 2502 - Subway Dijkstra堆优化试水

    做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...

  2. Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路

    2834: 回家的路 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 62  Solved: 38[Submit][Status][Discuss] D ...

  3. POJ2387(dijkstra堆优化)

    Til the Cows Come Home Bessie is out in the field and wants to get back to the barn to get as much s ...

  4. hdu 2544 单源最短路问题 dijkstra+堆优化模板

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  5. 深入理解dijkstra+堆优化

    深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra   对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...

  6. dijkstra堆优化(multiset实现->大大减小代码量)

    例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...

  7. POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化

    昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...

  8. Dijkstra堆优化学习

    最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点 ...

  9. 【Dijkstra堆优化】洛谷P2243电路维修

    题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...

  10. hdu3790 dijkstra+堆优化

    题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3790 分析:dijkstra没有优化的话,复杂度是n*n,优化后的复杂度是m*logm,n是顶点数,m ...

随机推荐

  1. Jenkins中的Job配置里缺少“触发远程构建(例如,使用脚本)”选项的问题解决

    如图所示的功能没有出现在Job配置页面,这是由于权限问题导致的,解决方法如下: 1.[系统管理]->[Configure Global Security] 2.配置如下: 3.或者你有第三方权限 ...

  2. Spring中Bean的后置处理器

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/bean-post-processors.html: Bean后置处理器 BeanPostProce ...

  3. BroadcastReceiver详解(二)

    BroadCastReceiver 简介 (末尾有源码) BroadCastReceiver 源码位于: framework/base/core/java/android.content.Broadc ...

  4. JavaScript对列表节点的操作:删除指定节点、删除最后一个节点、删除第一个节点、删除所有节点、增加节点

    使用菜鸟的运行环境直接测试:http://www.runoob.com/try/try.php?filename=tryjs_events <!DOCTYPE html> <html ...

  5. memcache的学习路线图

     memcache学习材料 //memcache自带的github 上的 wiki     //席剑飞 Memcache(MC)系列 1~8系列 评注: memcache系统写的最深的一博客,建议一读 ...

  6. TFTP服务器

    为什么要学习有关TFTP服务器的安装及配置呢?主要是为了后续学习有关linux系统的无人值守安装做准备. TFTP简单文件传输协议,使用UDP的69端口.主要提供文件的上传和下载,TFTP一般是适用于 ...

  7. [LeetCode][Java] Container With Most Water

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...

  8. 基于canvas和Web Audio的音频播放器

    wavesurfer.js是一款基于HTML5 canvas和Web Audio的音频播放器插件.通过wavesurfer.js你能够使用它来制作各种HTML5音频播放器,它能够在各种支持 Web A ...

  9. 诊断并解决 ORA-4030 错误 (Doc ID 1548826.1)

    适用于: Oracle Database - Enterprise Edition - 版本号 8.1.7.4 和更高版本号 本文档所含信息适用于全部平台 用途 怎样诊断 ORA-4030 错误 排错 ...

  10. mysql 环境变量之 group_concat_max_len

    今天使用mysql group_concat()函数,对查询的数据进行字符串连接操作. 不过由于查询的结果较多,连接后的结果很长导致不能完全显示. 查询手册发现如下说明: (先说说group_conc ...