图-最短路径-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 ...
随机推荐
- EF架构~CodeFirst模型下的数据初始化
回到目录 我为什么会来 在传统的大型系统设计中,数据库建模是个比开发更早的环节,先有数据库,然后是ORM模型,最后才是开发程序,而这种模型在EF出现后发生了转变,而且有可能将来会被code first ...
- Atitit 基于图片图像 与文档混合文件夹的分类
Atitit 基于图片图像 与文档混合文件夹的分类 太小的文档(txt doc csv exl ppt pptx)单独分类 Mov10KminiDoc 但是可能会有一些书法图片迁移,因为他们很微小,需 ...
- rabbitmq消息队列——"Hello World!"
RabbitMQ 一."Hello World!" 1.简介: RabbitMQ是一种消息中间件,主要思想很简单:接收消息并转发.你可以将它设想为一个邮局:你往里面发送邮件并确保邮 ...
- exe文件添加为服务
首先,去下载一个叫rktools.exe的工具(我提供个下载地址Windows 2003 Resource Kits),下载完后安装该资源包,里面有个instsrv.exe和srvany.exe的工具 ...
- 玩转Django的POST请求 CSRF
玩转Django的POST请求 CSRF 不少麻油们玩django都会碰到这个问题,POST请求莫名其妙的返回 403 foribidden,希望这篇博文能解答所有问题 三种方法 To enable ...
- Android入门(十)SQLite创建升级数据库
原文链接:http://www.orlion.ga/603/ 一.创建数据库 Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类就可 ...
- 【原创】C#玩高频数字彩快3的一点体会
购彩风险非常高,本人纯属很久以前对数字高频彩的一点研究.目前已经远离数字彩,重点研究足球篮球比赛资料库和赛果预测. 这是一篇在草稿箱保存了1年多的文章,一直没发现,顺便修改修改分享给大家.以后会有更多 ...
- 关于CPU Cache -- 程序员需要知道的那些事
本文将介绍一些作为程序猿或者IT从业者应该知道的CPU Cache相关的知识.本章从"为什么会有CPU Cache","CPU Cache的大致设计架构",&q ...
- MongoDB的学习--索引
索引可以用来优化查询,而且在某些特定类型的查询中,索引是必不可少的.为集合选择合适的索引是提高性能的关键. 先来mock数据 for (i = 0; i < 1000000; i++) { db ...
- Unity3D 开发之shader教程(浅谈光照之漫反射diffuse)
在游戏开发过程中,光照应该是必不可少部分,当然,这是指大多数的稍微大型一些的3D游戏会需要,给模型或者山山水水加上光照,会看上去更加的真实,获得更好的体验.一个本身不发光物体显示什么颜色,在于本身反射 ...