hdu 1874 Dijkstra算法
先贴个网上找的比较通俗易懂的教程:
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算法的更多相关文章
- HDU 2112 HDU Today (Dijkstra算法)
HDU Today Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- 最短路 HDU - 2544 (dijkstra算法或Floyd算法)
Dijkstra解法: #include <stdio.h> #include <iostream> #include <cstring> #include < ...
- hdu 1874 dijkstra 队列实现 比数组高效特别在稀疏图
参考 http://blog.csdn.net/zhuyingqingfen/article/details/6370561 刘汝佳白皮书 #include<stdio.h> #incl ...
- 最短路径问题 HDU - 3790 (Dijkstra算法 + 双重权值)
参考:https://www.cnblogs.com/qiufeihai/archive/2012/03/15/2398455.html 最短路径问题 Time Limit: 2000/1000 MS ...
- HDU 1874 畅通工程续(初涉dijkstra算法实现)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1874 dijkstra算法实现可参照此博客学习:http://www.cnblogs.com/biye ...
- hdu 2680 Choose the best route (dijkstra算法)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2680 /************************************************* ...
- ACM: HDU 1874 畅通工程续-Dijkstra算法
HDU 1874 畅通工程续 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Desc ...
- Dijkstra算法and Floyd算法 HDU 1874 畅通工程续
Dijkstra算法描述起来比较容易:它是求单源最短路径的,也就是求某一个点到其他各个点的最短路径,大体思想和prim算法差不多,有个数组dis,用来保存源点到其它各个点的距离,刚开始很好办,只需要把 ...
- HDU 1874 畅通工程续-- Dijkstra算法详解 单源点最短路问题
参考 此题Dijkstra算法,一次AC.这个算法时间复杂度O(n2)附上该算法的演示图(来自维基百科): 附上: 迪科斯彻算法分解(优酷) problem link -> HDU 1874 ...
随机推荐
- 对自写的Asp.Net分页控件的应用方式(异步无刷新分页)
前台代码 <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" co ...
- java核心技术-IO
一 .IO 1.1 流的简单介绍和分类 Java流操作的相关的类和接口: Java流类图结构: 四个抽象基类分别为:InputStream .OutputStream .Reader .Writer: ...
- Struts2(二)— Result结果配置、Servlet的API的访问、模型驱动、属性驱动
一.Result结果配置 1.全局和局部结果 平常我们设置跳转页面,是在action标签里面加上 result标签来控制,这种设置的页面跳转,称之为局部结果页面但是我们有时候在很多个action里 ...
- ES6学习笔记(五)-函数扩展
- BZOJ P1188 HNOI2007 分裂游戏——solution
题目描述: (<--这个) 组合游戏,——把每个石头看做一个游戏, Multi_game——消去i上的石子后,,k上的游戏又多了一个: 于是就套用multi_game的模型即可 求解SG函数时, ...
- 纯css 画气泡
我们知道运用css可以绘画出各式各样的形状:三角形,圆形,正方形,椭圆形,平行四边形等等,而通过他们之间进行两两组合可以变换出各种意想不到的效果图,气泡框就是其中一个.最简单的气泡框就是一个矩形框+一 ...
- AngularJS+RequireJs实现动态加载JS和页面的方案研究【下】
about.js: [html] view plain copy 在CODE上查看代码片派生到我的代码片 define(['app'], function(app) { app.controller( ...
- Wasserstein GAN
在GAN的相关研究如火如荼甚至可以说是泛滥的今天,一篇新鲜出炉的arXiv论文<Wasserstein GAN>却在Reddit的Machine Learning频道火了,连Goodfel ...
- MUI框架-10-MUI 数据交互-跳转详情页面
MUI框架-10-MUI 数据交互-跳转详情页面 上一篇介绍了如何实现数据交互,给别人的 API 发送 ajax 请求,我们得到数据,再使用 art-template 模板引擎拼接 HTML,最终实现 ...
- js变量作用域--变量提升
1.JS作用域 在ES5中,js只有两种形式的作用域:全局作用域和函数作用域,在ES6中,新增了一个块级作用域(最近的大括号涵盖的范围),但是仅限于let方式申明的变量. 2.变量声明 var x; ...