Dijkstra堆优化
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堆优化的更多相关文章
- POJ 2502 - Subway Dijkstra堆优化试水
做这道题的动机就是想练习一下堆的应用,顺便补一下好久没看的图论算法. Dijkstra算法概述 //从0出发的单源最短路 dis[][] = {INF} ReadMap(dis); for i = 0 ...
- Bzoj 2834: 回家的路 dijkstra,堆优化,分层图,最短路
2834: 回家的路 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 62 Solved: 38[Submit][Status][Discuss] D ...
- 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 ...
- hdu 2544 单源最短路问题 dijkstra+堆优化模板
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 深入理解dijkstra+堆优化
深入理解dijkstra+堆优化 其实就这几种代码几种结构,记住了完全就可以举一反三,所以多记多练多优化多思考. Dijkstra 对于一个有向图或无向图,所有边权为正(边用邻接矩阵的形式给出), ...
- dijkstra堆优化(multiset实现->大大减小代码量)
例题: Time Limit: 1 second Memory Limit: 128 MB [问题描述] 在电视时代,没有多少人观看戏剧表演.Malidinesia古董喜剧演员意识到这一事实,他们想宣 ...
- POJ 1511 - Invitation Cards 邻接表 Dijkstra堆优化
昨天的题太水了,堆优化跑的不爽,今天换了一个题,1000000个点,1000000条边= = 试一试邻接表 写的过程中遇到了一些问题,由于习惯于把数据结构封装在 struct 里,结果 int [10 ...
- Dijkstra堆优化学习
最短路径例题 今天特地学习了Dijkstra的堆优化(主要是慕名已久). 我们需要一个堆来记录[编号,到编号这个点的最短路径值(当然只是当前的)] 与原来的Dijkstra操作基本一致,主要有以下几点 ...
- 【Dijkstra堆优化】洛谷P2243电路维修
题目背景 Elf 是来自Gliese 星球的少女,由于偶然的原因漂流到了地球上.在她无依无靠的时候,善良的运输队员Mark 和James 收留了她.Elf 很感谢Mark和James,可是一直也没能给 ...
- hdu3790 dijkstra+堆优化
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=3790 分析:dijkstra没有优化的话,复杂度是n*n,优化后的复杂度是m*logm,n是顶点数,m ...
随机推荐
- 使用EventNext实现基于事件驱动的业务处理
事件驱动模型相信对大家来说并不陌生,因为这是一套非常高效的逻辑处理模型,通过事件来驱动接下来需要完成的工作,而不像传统同步模型等待任务完成后再继续!虽然事件驱动有着这样的好处,但在传统设计上基于消息回 ...
- T2038 香甜的黄油 codevs
http://codevs.cn/problem/2038/ 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 农夫John ...
- innodb 修改表共享空间为独立空间
最近在优化mysql innodb存储引擎,准备把共享表空间转换成独立表空间.刚开始的没考虑这么多,过段时间又要推广,所以优化一下,看看效果如何.说一个转换过程. 1,查看一下是共享表空间,还是独立表 ...
- NAND FLash基础概念介绍
一.引脚介绍 引脚名称 引脚功能 CLE 命令锁存功能 ALE 地址锁存功能 /CE 芯片使能 /RE 读使能 /WE 写使能 /WP 写保护 R/B 就绪/忙输出信号 Vcc 电源 Vss 地 N. ...
- Android平台Camera实时滤镜实现方法探讨(十一)--实时美颜滤镜
上一章完毕了对图片的磨皮处理.经过简单算法流程优化,能够达到非常快的速度.可是不能用于实时美颜.经实验,若採用仅仅处理Y信号的方案.半径极限大约是5-10,超过10则明显感受到卡顿.但对于1920X1 ...
- 《大话操作系统——做坚实的project实践派》(7)
写操作系统内核须要了解一个详细计算平台的CPU,包含这个CPU里的寄存器和异常中断处理机制
- AspNet MVC4 教学-23:Asp.Net MVC4 Display And Editor 模板技术高速应用Demo
A.创建Basic类型的项目. B.在Model文件夹下,创建3个文件: Role.cs: using System; using System.Collections.Generic; using ...
- C++再论单例模式
#include <iostream> #include <windows.h> #include <mutex> std::mutex gmutex; using ...
- eureka高可用注册中心
Eureka高可用注册中心 两个配置文件: application-peer1.properties application-peer2.properties 都需要加上 eureka.client. ...
- 转载:用python爬虫抓站的一些技巧总结
原文链接:http://www.pythonclub.org/python-network-application/observer-spider 原文的名称虽然用了<用python爬虫抓站的一 ...