DJ 算法的队列优先优化
DJ算法就是求单源最短路的算法,但是时间复杂度不太理想,所以在此献上用最小堆来优化的算法。
如果不懂优先队列可以先去看STL分类关于优先队列的介绍;
///POJ 2387为例
#include<stdio.h>
#include<string.h>
#include<queue>
#include<algorithm>
#include<stdlib.h>
using namespace std;
const int maxn = 1e3 + ;
const int INF = 0x3f3f3f3f;
typedef pair<int, int> HeapNode;///在堆里面的是pair、first为到起点距离、second为点编号
struct EDGE{ int v, nxt, w; }; int Head[maxn], Dis[maxn];
EDGE Edge[maxn*];
int N, M, cnt; inline void init()
{
for(int i=; i<=N; i++)
Head[i]=-, Dis[i]=INF;
cnt = ;
} inline void AddEdge(int from, int to, int weight)
{
Edge[cnt].w = weight;
Edge[cnt].v = to;
Edge[cnt].nxt = Head[from];
Head[from] = cnt++;
} int Dijkstra()
{
priority_queue<HeapNode, vector<HeapNode>, greater<HeapNode> > Heap;
Dis[] = ;
Heap.push(make_pair(, ));
while(!Heap.empty()){
pair<int, int> T = Heap.top(); Heap.pop();
if(T.first != Dis[T.second]) continue;///有很多版本都是用 vis 标记是否已经使用这个点松弛过、这里可以用这个不同的方法! for(int i=Head[T.second]; i!=-; i=Edge[i].nxt){
int Eiv = Edge[i].v;
if(Dis[Eiv] > Dis[T.second] + Edge[i].w){
Dis[Eiv] = Dis[T.second] + Edge[i].w;
Heap.push(make_pair(Dis[Eiv], Eiv));
}
}
}
return Dis[N];
} int main(void)
{
while(~scanf("%d %d", &M, &N)){ init(); int from, to, weight;
for(int i=; i<M; i++){
scanf("%d %d %d", &from, &to, &weight);
AddEdge(from, to, weight);
AddEdge(to, from, weight);
} printf("%d\n", Dijkstra());
}
return ;
}
该算法实现了1到各个点的最短距离;
DJ 算法的队列优先优化的更多相关文章
- 单调队列 && 斜率优化dp 专题
首先得讲一下单调队列,顾名思义,单调队列就是队列中的每个元素具有单调性,如果是单调递增队列,那么每个元素都是单调递增的,反正,亦然. 那么如何对单调队列进行操作呢? 是这样的:对于单调队列而言,队首和 ...
- java代码实现队列的优化
package com.voole.queun; /** * @Decription 队列 * @author TMAC-J * */ public class Queun { /** * 初始化队列 ...
- HDU 3507 单调队列 斜率优化
斜率优化的模板题 给出n个数以及M,你可以将这些数划分成几个区间,每个区间的值是里面数的和的平方+M,问所有区间值总和最小是多少. 如果不考虑平方,那么我们显然可以使用队列维护单调性,优化DP的线性方 ...
- 蓝桥 ADV-233 算法提高 队列操作 【STL】
算法提高 队列操作 时间限制:1.0s 内存限制:256.0MB 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. ...
- Java实现 蓝桥杯 算法提高 队列操作
算法提高 队列操作 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 队列操作题.根据输入的操作命令,操作队列(1)入队.(2)出队并输出.(3)计算队中元素个数并输出. 输入格式 ...
- 谷歌蜂鸟算法对网站seo优化有何影响
http://www.wocaoseo.com/thread-89-1-1.html 谷歌在过去三个月里,非常低调的推出了蜂鸟算法,据谷歌技术员表示,此种方法一出,将影响90%网站的排名, ...
- Python实现的数据结构与算法之队列详解
本文实例讲述了Python实现的数据结构与算法之队列.分享给大家供大家参考.具体分析如下: 一.概述 队列(Queue)是一种先进先出(FIFO)的线性数据结构,插入操作在队尾(rear)进行,删除操 ...
- 【数据结构与算法】——队列(Queue)
队列(Queue)的一个使用场景 银行排队的案例: 队列(Queue)介绍 队列是一个有序列表,可以用数组或是链表来实现. 遵循先入先出的原则.即:先存入队列的数据,要先取出来.后存入的要后取出来. ...
- Bellman-Ford算法及其队列优化(SPFA)
一.算法概述 Bellman-Ford算法解决的是一般情况下的单源最短路径问题.所谓单源最短路径问题:给定一个图G=(V,E),我们希望找到从给定源结点s属于V到每个结点v属于V的最短路径.单源最短路 ...
随机推荐
- Android开发 开启闪光灯 关键代码
在AndroidManifest中注册响应的权限: <uses-permission android:name="android.permission.FLASHLIGHT" ...
- JavaScript中的匿名函数及函数的闭包(转)
JavaScript中的匿名函数及函数的闭包 https://www.cnblogs.com/wl0000-03/p/6050108.html 1.匿名函数 函数是JavaScript中最灵活的一种 ...
- Codeforces #505(div1+div2) B Weakened Common Divisor
题意:给你若干个数对,每个数对中可以选择一个个元素,问是否存在一种选择,使得这些数的GCD大于1? 思路:可以把每个数对的元素乘起来,然后求gcd,这样可以直接把所有元素中可能的GCD求出来,从小到大 ...
- C++指针作为函数的参数进行传递时注意的问题
应注意问题: 当指针作为函数的参数进行传递的时候,本质上还是进行的"值传递",也就是复制了一个新的指向该地址的指针变量. 只有在被调函数中,对指针进行引用操作,才可以达到不需要返回 ...
- 简单的jQuery前端验证码校验
简单的jQuery前端验证码校验2 html; <!DOCTYPE html> <html lang="zh-cn"> <head> <m ...
- p4213 【模板】杜教筛(Sum)
传送门 分析 我们知道 $\varphi * 1 = id$ $\mu * 1 = e$ 杜教筛即可 代码 #include<iostream> #include<cstdio> ...
- Umbraco中获取UmbracoContext
在Umbraco项目中,获取当前的UmbracoContext几乎是都需要用到的,我们一般通过一个静态方法来获取,代码如下 public class ContextHelpers { public s ...
- static的功能
static : 翻译成中文是静态的意思. 使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名,因为同名也没有关系. 在C语言中,static的 ...
- Dojo Javascript 编程规范(转)
前言 相当不错的 Javascript 编程风格规范,建议大家采用此规范编写 Javascript.原文链接: http://dojotoolkit.org/developer/StyleGuide ...
- Vistual Studio的导出模板功能
应用场景,每个项目有自己固定的目录结构和引用文件, 无需每次创建一个项目,就手工一一将那些目录再new一遍.如图所示 菜单 文件=>导出模板 之后的操作基本上一路"下一步" ...