OJ5.2很简单,使用priority_queue实现了最小堆竟然都过了OJ……每次遇到relax的问题时都简单粗暴地重新push进一个节点……

然而正确的实现应该是下面这样的吧,关键在于swap堆中元素时使用pos数组存储改变位置后的编号为k的节点对应在堆中的位置。下面这种实现也很简单,d,v,p均存储在堆中,只有pos指明位置。源代码作者很聪明>_<

#include <stdio.h>

#define MAXN 1200
#define MAXM 1200000
#define INF 19930317 struct node
{
int d, v, p;
}heap[MAXN];
int pos[MAXN], hl; int e[MAXM], cost[MAXM], next[MAXM], g[MAXN], size; int m, n, s, t; void insert(int u, int v, int w)
{
e[++size] = v;
next[size] = g[u];
cost[size] = w;
g[u] = size;
} void swap(int a, int b)
{
heap[] = heap[a];
heap[a] = heap[b];
heap[b] = heap[];
pos[heap[a].v] = a;
pos[heap[b].v] = b;
} void heapfy()
{
int i = ;
while (i <= hl)
{
if ((i < hl) && (heap[i + ].d < heap[i].d))
i++;
if (heap[i].d < heap[i >> ].d)
{
swap(i, i >> );
i <<= ;
}
else
break;
}
} void decrease(int i)
{
while ((i != ) && (heap[i].d < heap[i >> ].d))
{
swap(i, i >> );
i >>= ;
}
} void relax(int u ,int v, int w)
{
if (w + heap[pos[u]].d < heap[pos[v]].d)
{
heap[pos[v]].p = u;
heap[pos[v]].d = w + heap[pos[u]].d;
decrease(pos[v]);
}
} void delete_min()
{
swap(, hl);
hl--;
heapfy();
} void init()
{
int u ,v ,w, i; scanf("%d%d", &m, &n);
for (i = ; i <= m; i++)
{
scanf("%d%d%d", &u, &v, &w);
insert(u, v, w);
insert(v, u, w);
}
s = ;
t = n;
} int dijkstra()
{
int u, p, i; for (i = ; i <= n; i++)
{
heap[i].v = pos[i] = i;
heap[i].d = INF;
}
heap[s].p = s;
heap[s].d = ;
swap(, s);
hl = n;
while (hl)
{
u = heap[].v;
delete_min();
p = g[u];
while (p)
{
if (pos[e[p]] <= hl)
relax(u, e[p], cost[p]);
p = next[p];
} }
}
int main()
{
init();
dijkstra();
printf("%d\n", heap[pos[t]].d);
return ;
}

使用最小堆优化Dijkstra算法的更多相关文章

  1. 配对堆优化Dijkstra算法小记

    关于配对堆的一些小姿势: 1.配对堆是一颗多叉树. 2.包含优先队列的所有功能,可用于优化Dijkstra算法. 3.属于可并堆,因此对于集合合并维护最值的问题很实用. 4.速度快于一般的堆结构(左偏 ...

  2. 堆优化Dijkstra算法

    但是,我们会发现刚刚讲的朴素Dijkstra算法(高情商:朴素 : 低情商: 低效)的套路不适用于稀疏图,很容易会爆时间: 所以,我们要对其中的一些操作进行优化,首先我们发现找到里起始点最近的点去更新 ...

  3. luogu P3371 & P4779 单源最短路径spfa & 最大堆优化Dijkstra算法

    P3371 [模板]单源最短路径(弱化版) 题目背景 本题测试数据为随机数据,在考试中可能会出现构造数据让SPFA不通过,如有需要请移步 P4779. 题目描述 如题,给出一个有向图,请输出从某一点出 ...

  4. PAT-1030 Travel Plan (30 分) 最短路最小边权 堆优化dijkstra+DFS

    PAT 1030 最短路最小边权 堆优化dijkstra+DFS 1030 Travel Plan (30 分) A traveler's map gives the distances betwee ...

  5. BZOJ5415[Noi2018]归程——kruskal重构树+倍增+堆优化dijkstra

    题目描述 本题的故事发生在魔力之都,在这里我们将为你介绍一些必要的设定. 魔力之都可以抽象成一个 n 个节点.m 条边的无向连通图(节点的编号从 1 至 n).我们依次用 l,a 描述一条边的长度.海 ...

  6. 【堆优化Dijkstra+字典序最短路方案】HDU1385-Minimum Transport Cost

    [题目大意] 给出邻接矩阵以及到达各个点需要付出的代价(起点和终点没有代价),求出从给定起点到终点的最短路,并输出字典序最小的方案. [思路] 在堆优化Dijkstra中,用pre记录前驱.如果新方案 ...

  7. 【bzoj5197】[CERC2017]Gambling Guide 期望dp+堆优化Dijkstra

    题目描述 给定一张n个点,m条双向边的无向图. 你要从1号点走到n号点.当你位于x点时,你需要花1元钱,等概率随机地买到与x相邻的一个点的票,只有通过票才能走到其它点. 每当完成一次交易时,你可以选择 ...

  8. 堆优化Dijkstra计算最短路+路径计数

    今天考试的时候遇到了一道题需要路径计数,然而蒟蒻从来没有做过,所以在考场上真的一脸懵逼.然后出题人NaVi_Awson说明天考试还会卡SPFA,吓得我赶紧又来学一波堆优化的Dijkstra(之前只会S ...

  9. 【bzoj2259】[Oibh]新型计算机 堆优化Dijkstra

    题目描述 Tim正在摆弄着他设计的“计算机”,他认为这台计算机原理很独特,因此利用它可以解决许多难题. 但是,有一个难题他却解决不了,是这台计算机的输入问题.新型计算机的输入也很独特,假设输入序列中有 ...

随机推荐

  1. hdu_3068 最长回文(Manacher算法)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3068 最长回文 Time Limit: 4000/2000 MS (Java/Others)    M ...

  2. leak finder

    介绍 leak finder 是google开源团队发布了一个新的可以帮助web应用程序开发者在他们的JavaScript程序中找出内存泄露问题的工具: http://feedproxy.google ...

  3. 久未更 ~ 四之 —— Vsftpd出现 Failed to start Vsftpd ftp daemon错误

    > > > > > 久未更 系列一:Failed to start Vsftpd ftp daemon错误 配置 vsftpd.conf文件后 重启ftp服务 出现 Fa ...

  4. c++---天梯赛---查验身份证

    ★题目: ★题目分析:本题要求输入一个数字n,随后n行输入n个身份证号码.之后进行进一步的判断把错误的身份证号码输出.如果全部正确输出All passed. ★思路方法: ①按题目要求输入. ②对前1 ...

  5. vue前后台数据交互vue-resource文档

    地址:https://segmentfault.com/a/1190000007087934 Vue可以构建一个完全不依赖后端服务的应用,同时也可以与服务端进行数据交互来同步界面的动态更新. Vue通 ...

  6. php 使用 ffmpeg 转换视频,截图,并生成缩略图

    http://blog.csdn.net/toss156/article/details/7003059 把ffmpeg 和  生成缩略图整合了一下. include("ImageResiz ...

  7. JVM内存划分简介

    参考:深入理解JAVA虚拟机(第二版)

  8. ListCtrl控件

    一 CListCtrl类型 LVS_EDITLABELS LVS_OWNERDRAWFIXED LVS_REPORT LVS_SHOWSELALWAYS LVS_SINGLESEL LVS_SMALL ...

  9. MySQL 报错 _DATA_TYPE_INVALID_

    报错如下: Fatal error: Uncaught Exception: _DATA_TYPE_INVALID_ :[status=>0] in /usr/local/nginx/html/ ...

  10. org.json.JSONObject的optXXX方法

    JSONObject有很多optXXX方法,比如optBoolean,optString,optInt.... 他们的意思是:如果这个JSONObject对象,如果有返回这个属性的值,如果没有返回一个 ...