本文作者frankchenfu,blogs网址http://www.cnblogs.com/frankchenfu/,转载请保留此文字。

图论其实是比较难的一种题型,但是一些模板题,是没有什么太大难度的!

这里给大家带来的是迪杰斯特拉(Dijkstra)算法。

迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法。

是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。

迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。

#include<cstdio>
#include<cstring>
#include<queue>
#define reg register
using namespace std;
const int N=;
const int M=;
int n,m,s,t,d[N];
int edge,e[M],b[M],w[M],fir[N];
void add(reg int x,reg int y,reg int z)
{
e[++edge]=y;
w[edge]=z;
b[edge]=fir[x];
fir[x]=edge;
}
struct node
{
int i,di;
};
bool operator<(node a,node b)
{
return a.di>b.di;
}
priority_queue<node>que;
void input()
{
scanf("%d%d%d%d",&n,&m,&s,&t);
for(reg int i=;i<=m;i++)
{
reg int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
memset(d,0x7f,sizeof(d));
que.push((node){s,});
d[s]=;
}
void work()
{
for(;!que.empty();)
{
node t=que.top();
que.pop();
if(d[t.i]!=t.di)
continue;
for(reg int k=fir[t.i];k;k=b[k])
if(t.di+w[k]<d[e[k]])
{
d[e[k]]=t.di+w[k];
que.push((node){e[k],d[e[k]]});
}
}
}
void output()
{
printf("%d\n",d[t]);
}
int main()
{
input();
work();
output();
return ;
}

我们看到,一般的Dijkstra算法好像不需要STL,可是这个优先队列呢?它是进行堆优化的。

理论上,堆优化可以是Dijkstra算法时间复杂度降到O(n log n),这样不是很好吗?多写几行,时间快不少,何乐而不为?

需要注意的大概就这些,希望大家继续努力,天天AC!

备注:

标准模板题是 [USACO09OCT] Heat Wave 热浪。

链接参考(来自“洛谷”):http://www.luogu.org/problem/show?pid=1339

图论——Dijkstra算法的更多相关文章

  1. Cocos2d-x 地图步行实现1:图论Dijkstra算法

    下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...

  2. [图论]Dijkstra 算法小结

    Dijkstra 算法小结  By Wine93 2013.11 1. Dijkstra 算法相关介绍 算法阐述:Dijkstra是解决单源最短路径的算法,它可以在O(n^2)内计算出源点(s)到图中 ...

  3. 图论--Dijkstra算法总结

    Key word: ①BFS转换Dijkstra ②其他关系转化为最短路 ③反向建边及反向Dijkstra ④稠密图.稀疏图 ⑤链式前向星 ⑥Vector建图 ⑦超级源点&汇点 详解: 1.B ...

  4. 《算法导论》读书笔记之图论算法—Dijkstra 算法求最短路径

    自从打ACM以来也算是用Dijkstra算法来求最短路径了好久,现在就写一篇博客来介绍一下这个算法吧 :) Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的 ...

  5. 图论基础之Dijkstra算法的初探

         图论,顾名思义就是有图有论.        图:由点"Vertex"和边"Edge "组成,且图分为有向图和无向图(本文讨论有向图),之前做毕业设计的 ...

  6. 图论之Dijkstra算法

    Dijkstra算法是图论中经典的最短路径算法之一,主要用于解决单源最短路径问题. 单源最短路径问题,即求某个源节点到其他各个节点的最短路径. Dijkstra算法采用了贪心算法的思想,如图求1号节点 ...

  7. 图论之最短路径(1)——Floyd Warshall & Dijkstra算法

    开始图论学习的第二部分:最短路径. 由于知识储备还不充足,暂时不使用邻接表的方法来计算. 最短路径主要分为两部分:多源最短路径和单源最短路径问题 多源最短路径: 介绍最简单的Floyd Warshal ...

  8. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

  9. 图论算法(四)Dijkstra算法

    最短路算法(三)Dijkstra算法 PS:因为这两天忙着写GTMD segment_tree,所以博客可能是seg+图论混搭着来,另外segment_tree的基本知识就懒得整理了-- Part 1 ...

随机推荐

  1. eclipse创建android项目,无法正常预览布局文件

    http://jingyan.baidu.com/article/d621e8da0e0e052865913fae.html

  2. matlab中gatbx工具箱的添加

    1. 从http://crystalgate.shef.ac.uk/code/下载工具箱压缩包gatbx.zip 2. 解压gatbx.zip,将其子文件夹genetic放在matlab安装目录too ...

  3. iOS 为label添加删除线

    UILabel *testLabel = [[ UILabel alloc] initWithFrame:CGRectMake(, , , )]; testLabel.numberOfLines = ...

  4. 在阿里云ECS(CentOS6.5)上安装ftp

    安装vsftpd 命令: yum install vsftpd –y 结果: 创建ftp存取文件的目录,用户名,密码 命令: useradd -d /home/ftp -g ftp -s /sbin/ ...

  5. FZU 1397 保送

    网络流入门题. 源点到每一个学生连一条边,容量为1 每个学校到汇点连一条边,容量为L 符合要求的学生和学校之间连边,容量为1. 从源点到汇点的最大流就是答案. #include<cstdio&g ...

  6. Spring AOP进行日志记录,管理

    在java开发中日志的管理有很多种.我一般会使用过滤器,或者是Spring的拦截器进行日志的处理.如果是用过滤器比较简单,只要对所有的.do提交进行拦截,然后获取action的提交路径就可以获取对每个 ...

  7. HCSR04超声波传感器驱动

    HC_SR04是一款使用较为广泛的超声波测距模块,模块图如下 该模块具有四个引脚,分别为VCC GND TRIG ECHO,其中VCC GND为供电脚 TRIG为测距触发引脚,ECHO为测距输入引脚 ...

  8. NavigationControllerr滑动返回

    iOS 7中在传统的左上角返回键之外,提供了右滑返回上一级界面的手势.支持此手势的是UINavigationController中新增的属性 interactivePopGestureRecogniz ...

  9. Xshell连接虚拟机VMware

    最大的生活乐趣就是搞各种软件,系统,无聊的我开始搞centos了(需要对网络有深刻的理解) 一.学习使用xshell来控制VMware上的Centos6.5,可是每次重启IP都会改变 不太理解虚拟机V ...

  10. bzoj 3572世界树 虚树+dp

    题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...