先贴个网上找的比较通俗易懂的教程:

2.1Dijkstra算法(非负权,使用于有向图和无向图)

  Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。

Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。 

2.2  Dijkstra算法思想

Dijkstra算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。

2.3  Dijkstra算法具体步骤  

1)初始时,S只包含源点,即S=,v的距离为0。U包含除v外的其他顶点,U中顶点u距离为边上的权(若v与u有边)或 )(若u不是v的出边邻接点)。

(2)从U中选取一个距离v最小的顶点k,把k,加入S中(该选定的距离就是v到k的最短路径长度)。

(3)以k为新考虑的中间点,修改U中各顶点的距离;若从源点v到顶点u(u U)的距离(经过顶点k)比原来距离(不经过顶点k)短,则修改顶点u的距离值,修改后的距离值的顶点k的距离加上边上的权。

(4)重复步骤(2)和(3)直到所有顶点都包含在S中。

2.4  Dijkstra算法举例说明

如下图,设A为源点,求A到其他各顶点(B、C、D、E、F)的最短路径。线上所标注为相邻线段之间的距离,即权值。(注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一一对等)

图一:Dijkstra无向图

算法执行步骤如下表:

然后是伪代码:

清除所有点标记

d[0] = 0,其他d[i] = INF

循环n次

{

  在所有未标记节点中,选出d值最小的结点x

  标记x结点

  对于从x出发的所有边(x,y),更新d[y] = min(d[y], d[x] + w(x,y))

}

假设起始结点为start,它到结点i的路径长d[i], 未标记结点v[i] = 0,已标记v[i]=1.
w[x][y] = INF表示边(x,y)不存在
模板代码:

memset(v, , sizeof(v));
for (int i = ; i < n; ++i)
d[i] = (i == start ? : INF);
for (int i = ; i < n; ++i)
{
int x, m = INF;
for (int y = ; y < n; ++y)
if (!v[y] && d[y] <= m)
{
x = y;
m = d[y];
}
v[x] = ;
for (int y = ; y < n; ++y)
d[y] = min(d[y], d[x] + w[x][y]);
}

用一道题目练练:

http://acm.hdu.edu.cn/showproblem.php?pid=1874

 #include <iostream>
#include <cstdio>
using namespace std;
const int INF = INT_MAX / ;
int main()
{
int n, m;
while (scanf("%d %d", &n, &m) != EOF)
{
int w[n][n];
for (int i = ; i < n; ++i)
for (int j = ; j < n; ++j)
w[i][j] = INF;
int a, b, c;
for (int i = ; i < m; ++i)
{
scanf("%d %d %d", &a, &b, &c);
if (c < w[a][b]) //一个坑,无向图可能有多条路,求最短的
w[a][b] = w[b][a] = c;
}
int start, end;
scanf("%d %d", &start, &end);
int d[n], v[n];
for (int i = ; i < n; ++i)
v[i] = ;
for (int i = ; i < n; ++i)
d[i] = (i == start ? : INF);
for (int i = ; i < n; ++i)
{
int x, m = INF;
for (int y = ; y < n; ++y)
if (!v[y] && d[y] <= m)
m = d[x=y];
v[x] = ;
for (int y = ; y < n; ++y)
d[y] = d[y] < d[x] + w[x][y] ? d[y] : d[x] + w[x][y];
}
if (d[end] != INF)
printf("%d\n", d[end]);
else
printf("-1\n");
}
return ;
}

hdu 1874 Dijkstra算法的更多相关文章

  1. HDU 2112 HDU Today (Dijkstra算法)

    HDU Today Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  2. 最短路 HDU - 2544 (dijkstra算法或Floyd算法)

    Dijkstra解法: #include <stdio.h> #include <iostream> #include <cstring> #include < ...

  3. hdu 1874 dijkstra 队列实现 比数组高效特别在稀疏图

    参考  http://blog.csdn.net/zhuyingqingfen/article/details/6370561 刘汝佳白皮书 #include<stdio.h> #incl ...

  4. 最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)

    参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html 最短路径问题 Time Limit: 2000/1000 MS ...

  5. HDU 1874 畅通工程续(初涉dijkstra算法实现)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 dijkstra算法实现可参照此博客学习:http://www.cnblogs.com/biye ...

  6. hdu 2680 Choose the best route (dijkstra算法)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2680 /************************************************* ...

  7. ACM: HDU 1874 畅通工程续-Dijkstra算法

    HDU 1874 畅通工程续 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Desc ...

  8. Dijkstra算法and Floyd算法 HDU 1874 畅通工程续

    Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把 ...

  9. HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题

    参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上:  迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...

随机推荐

  1. 利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载

    简述 可能大家都知道,php中有一个函数叫debug_backtrace,它可以回溯跟踪函数的调用信息,可以说是一个调试利器. 好,来复习一下 01 one(); 02 03 function one ...

  2. ssh 连接慢问题

    连接先看报错: There were 11 failed login attempts since the last successful login. 先前有上百上千失败login,被攻击了,把短时 ...

  3. Java中InputStream 、 InputStreamReader 、 BufferedReader的区别

    1.InputStream.OutputStream 处理字节流的抽象类 InputStream 是字节输入流的所有类的超类,一般我们使用它的子类,如FileInputStream等. OutputS ...

  4. DOM基础代码练习(一)

    上一篇介绍了一下DOM的一些基础的知识,这里我整理了一些有关上一篇知识点的一些封装函数. 1.遍历元素节点 function retChild(node) { var child = node.chi ...

  5. Bzoj4766: 文艺计算姬(Matrix-tree/prufer)

    BZOJ 答案就是 \(n^{m-1}m^{n-1}\) \(prufer\) 证明: \(n\) 中的数字出现 \(m-1\) 次,\(m\) 中出现 \(n-1\) 次,根据 \(prufer\) ...

  6. 常用SEO优化

  7. 关于StringBuffe()长度和初始化长度的问题归纳

    晚上做一个习题,发现了一个关于StringBuffer()长度的问题 根据理解大致可以归为以下知识. 直接上代码分析吧 public class StringBuffer_length_capacit ...

  8. MySQL数据库更改默认引擎为Innodb【配置】

    InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyIS ...

  9. 国内外有名的java论坛

     国内: www.chinajavaworld.com-论坛人很多,高手也多,不过好像都在潜水      www.cn-java.com -也很不错,文章很好,但是就是商业性浓了点.      www ...

  10. 用Java开发贪吃蛇游戏

    贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始 ...