图-最短路径-Dijktra(迪杰斯特拉)算法
1. 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉算法于1959 年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
2.
原图来自:http://blog.sina.com.cn/s/blog_4b9aefc20100zu8h.html
3.代码实现:
- /* 用邻接矩阵表示的图的Dijkstra算法的源程序*/
- #include <iostream>
- using namespace std;
- #define MAXVEX 100
- #define MAX 1e+4
- typedef char VexType;
- typedef float AdjType;
- typedef struct
- {
- int n; //图的顶点个数
- // VexType vexs[MAXVEX]; //顶点
- AdjType arcs[MAXVEX][MAXVEX]; //边
- }GraphMatrix;
- typedef struct {
- // VexType vertex; //顶点信息
- AdjType length; // 最短路径长度
- int prevex; // 从v0到达vi(i=1,2,…n-1)的最短路径上vi的前驱顶点
- }Path;
- Path dist[6]; // n为图中顶点个数
- void dijkstra(GraphMatrix graph, Path dist[])
- {
- int i,j,minvex;
- AdjType min; // 初始化,此时集合U中只有顶点v0
- dist[0].length = 0; dist[0].prevex = 0;
- graph.arcs[0][0] = 1; // 表示顶点v0在集合U中
- for(i = 1; i < graph.n; i++)
- { // 初始化集合V-U中顶点的距离值
- dist[i].length=graph.arcs[0][i];
- if (dist[i].length != MAX)
- dist[i].prevex=0;
- else dist[i].prevex= -1;
- }
- for(i = 1; i < graph.n; i++)
- {
- min=MAX; minvex=0;
- for (j = 1; j < graph.n; j++) //在V-U中选出距离值最小顶点
- if( graph.arcs[j][j] == 0 && dist[j].length < min )
- {
- min=dist[j].length; minvex=j;
- }
- if(minvex == 0) break; // 从v0没有路径可以通往集合V-U中的顶点
- graph.arcs[minvex][minvex] = 1; // 集合V-U中路径最小的顶点为minvex,标记已经找过的结点
- for (j = 1; j < graph.n; j++)
- {
- // 调整集合V-U中的顶点的最短路径
- if(graph.arcs[j][j] == 1) continue;
- if(dist[j].length > dist[minvex].length + graph.arcs[minvex][j]) {
- dist[j].length = dist[minvex].length + graph.arcs[minvex][j];
- dist[j].prevex = minvex;
- }
- }
- }
- }
- GraphMatrix graph;
- void initgraph(){
- int i,j;
- graph.n=6;
- for (i = 0; i < graph.n; i++)
- for (j = 0; j < graph.n; j++)
- graph.arcs[i][j] = (i == j ? 0 : MAX);
- graph.arcs[0][1] = 50;
- graph.arcs[0][2] = 10;
- graph.arcs[1][2] = 15;
- graph.arcs[1][4] = 5;
- graph.arcs[2][0] = 20;
- graph.arcs[2][3] = 15;
- graph.arcs[3][1] = 20;
- graph.arcs[3][4] = 35;
- graph.arcs[4][3] = 30;
- graph.arcs[5][3] = 3;
- graph.arcs[0][4] = 45;
- }
- int main(){
- int i;
- initgraph();
- dijkstra(graph, dist);
- for (i = 0; i < graph.n; i++)
- printf("结点=%d (路径长度=%.0f 上一个节点=%d)\t\n",i, dist[i].length,dist[i].prevex);
- system("pause");
- return 0;
- }
结果展示:
学习建议:看书对于算法理解不如代码分步运行来的直接!
图-最短路径-Dijktra(迪杰斯特拉)算法的更多相关文章
- c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法
c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...
- 最短路径之迪杰斯特拉算法的Java实现
Dijkstra算法是最短路径算法中为人熟知的一种,是单起点全路径算法.该算法被称为是“贪心算法”的成功典范.本文接下来将尝试以最通俗的语言来介绍这个伟大的算法,并赋予java实现代码. 一.知识准备 ...
- 最短路径之迪杰斯特拉算法(Java)
1)Dijkstra算法适用于求图中两节点之间最短路径 2)Dijkstra算法设计比较巧妙的是:在求源节点到终结点自底向上的过程中,源节点到某一节点之间最短路径的确定上(这也是我之前苦于没有解决的地 ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP
文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...
- [从今天开始修炼数据结构]图的最短路径 —— 迪杰斯特拉算法和弗洛伊德算法的详解与Java实现
在网图和非网图中,最短路径的含义不同.非网图中边上没有权值,所谓的最短路径,其实就是两顶点之间经过的边数最少的路径:而对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,我们称路径上第 ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- 算法与数据结构(六) 迪杰斯特拉算法的最短路径(Swift版)
上篇博客我们详细的介绍了两种经典的最小生成树的算法,本篇博客我们就来详细的讲一下最短路径的经典算法----迪杰斯特拉算法.首先我们先聊一下什么是最短路径,这个还是比较好理解的.比如我要从北京到济南,而 ...
- 单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)
一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...
- 迪杰斯特拉算法dijkstra(可打印最短路径)
#include <iostream> #include <iomanip> #include <string> using namespace std; #def ...
随机推荐
- 缓存篇~第七回 Redis实现基于方法签名的数据集缓存(可控更新,分布式数据缓存)
返回目录 本篇文章可以说是第六回 Microsoft.Practices.EnterpriseLibrary.Caching实现基于方法签名的数据集缓存(可控更新,WEB端数据缓存)的续篇,事实上,有 ...
- iOS开发中数组常用的五种遍历方式
随着iOS的不断发展,apple也不断推出性能更高的数组遍历方式,下面将对熟悉的五种遍历方式进行列举. 首先定义一个数组,并获取数组长度 NSArray *array=@[",]; NSIn ...
- Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理
Atitit 图像清晰度 模糊度 检测 识别 评价算法 原理 1.1. 图像边缘一般都是通过对图像进行梯度运算来实现的1 1.2. Remark: 1 1.3. 1.失焦检测. 衡量画面模糊的主要方 ...
- Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串
Atiti 重定向标准输出到字符串转接口adapter stream流体系 以及 重定向到字符串 原理::syso 向ByteArrayOutputStream这个流理想write字节..然后可以使 ...
- 百度地图 api
首先在百度开发者中心申请ak 在页面head中引用必要的css样式和js脚本 <script type="text/javascript" src="http:// ...
- c# BlowFish 高速 对称加密
BlowFish 高速 对称加密 string key = "this is my key"; BlowFish algo = new BlowFish(key); string ...
- 将 PAGE_VERIFY 数据库选项设置为 CHECKSUM
此规则检查 PAGE_VERIFY 数据库选项是否已设置为 CHECKSUM.为 PAGE_VERIFY 数据库选项启用 CHECKSUM 后,SQL Server 数据库引擎会在向磁盘中写入页面时计 ...
- CSS选择器、CSS hack及CSS执行效率
主要内容: 1.CSS选择器.优先级与匹配原理 2. CSS 引入的方式有哪些 ? link 和 @import 的区别是 ? 3.CSS hack 4.如何书高效CSS 一.CSS选择器.优先级与 ...
- 【转】中间代码opcode的执行
原文链接:http://www.orlion.ga/941/ 原文:http://www.nowamagic.net/librarys/veda/detail/1543 假如我们现在使用的是CLI模式 ...
- poj 2187 Beauty Contest(凸包求解多节点的之间的最大距离)
/* poj 2187 Beauty Contest 凸包:寻找每两点之间距离的最大值 这个最大值一定是在凸包的边缘上的! 求凸包的算法: Andrew算法! */ #include<iostr ...