算法描述:
Dijkstra(迪杰斯特拉)算法是典型的最短路径路由算法,用于计算一个节点到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。
代码实现:
#include <stdio.h>
#include <stdlib.h>
#define MAXVERTEX 20
#define INF 65535
typedef char VertexType;
typedef int EdgeType;
typedef int Pathmatirx[MAXVERTEX];
typedef int ShortPathTable[MAXVERTEX];
typedef struct MGraph
{
VertexType vertex[MAXVERTEX];
EdgeType edge[MAXVERTEX][MAXVERTEX];
int numvex;
int numedge;
}MGraph; void CreateMGraph(MGraph *G)
{
int i = 0,j = 0,k = 0,w = 0;
printf("请输入图中顶点的数目和边的数目,中间用逗号隔开:\n");
scanf("%d,%d",&G->numvex,&G->numedge);
for(i = 0;i < G->numvex;i++)
{
for(j = 0;j < G->numvex;j++)
{
if(i == j)
{
G->edge[i][j] = 0;
}
else
{
G->edge[i][j] = INF;
}
}
}
for(k = 0;k < G->numedge;k++)
{
printf("请输入边vi-vj的边的下标 i 和 j ,以及权重w :\n");
scanf("%d,%d,%d",&i,&j,&w);
G->edge[i][j] = w;
G->edge[j][i] = G->edge[i][j];
}
printf("\n");
for(i = 0;i < G->numvex;i++)
{
for(j = 0;j < G->numvex;j++)
{
printf("%d ",G->edge[i][j]);
}
printf("\n");
}
} //Dijkstra算法实现 void ShortestPathByDijkstra(MGraph *G,int v0,Pathmatirx *P,ShortPathTable *D)
{
int i,j,k,w,min;
int final[MAXVERTEX]; for(i = 0;i < G->numvex;i++)
{
final[i] = 0;
(*D)[i] = G->edge[v0][i];
(*P)[i] = 0;
}
final[v0] = 1;
(*D)[v0] = 0;
for(i = 1;i <G->numvex;i++)
{
min = INF;
for(j = 0;j < G->numvex; j++)
{
if(final[j] == 0 && min > (*D)[j])
{
min = (*D)[j];
k = j;
}
} final[k] = 1;
for(w = 0;w < G->numvex;w++)
{
if(final[w] == 0 &&(min + G->edge[k][w] < (*D)[w]))
{
(*D)[w] = min + G->edge[k][w];
(*P)[w] = k;
}
}
}
for(i = 0;i < G->numvex;i++)
{
printf("%d",(*P)[i]);
}
} int main()
{
int k = 0;
struct MGraph G;
Pathmatirx P;
ShortPathTable D;
CreateMGraph(&G);
printf("Dijkstra算法求得的V0到V*的最短路径为:\n");
ShortestPathByDijkstra(&G,k,&P,&D);
return 0;
}
Dijkstra算法(迪杰斯塔拉算法)的更多相关文章
-
单源最短路径算法——Dijkstra算法(迪杰斯特拉算法)
一 综述 Dijkstra算法(迪杰斯特拉算法)主要是用于求解有向图中单源最短路径问题.其本质是基于贪心策略的(具体见下文).其基本原理如下: (1)初始化:集合vertex_set初始为{sourc ...
-
Dijkstra【迪杰斯特拉算法】
有关最短路径的最后一个算法——Dijkstra 迪杰斯特拉算法是由荷兰计算机科学家迪杰斯特拉于1959 年提出的,因此又叫迪杰斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路 ...
-
算法-迪杰斯特拉算法(dijkstra)-最短路径
迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中 ...
-
图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP
文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪 ...
-
全局路径规划算法Dijkstra(迪杰斯特拉算法)- matlab
参考博客链接:https://www.cnblogs.com/kex1n/p/4178782.html Dijkstra是常用的全局路径规划算法,其本质上是一个最短路径寻优算法.算法的详细介绍参考上述 ...
-
[链接]最短路径的几种算法[迪杰斯特拉算法][Floyd算法]
最短路径—Dijkstra算法和Floyd算法 http://www.cnblogs.com/biyeymyhjob/archive/2012/07/31/2615833.html Dijkstra算 ...
-
floyd算法&;迪杰斯特拉算法
; k<=n; k++) ; i<=n; i++) ; j<=n; j++) { gra[i][j]=min(gra[i][j],gra[i][k]+gra[k][j]); } vo ...
-
数据结构之---C语言实现最短路径之Dijkstra(迪杰斯特拉)算法
此处共同拥有两段代码: 一. 这段代码比較全面,当中參考了github上的相关源代码. 能够说功能强大. //Dijkstra(迪杰斯特拉算法) #include <stdio.h> #i ...
-
Java 迪杰斯特拉算法实现查找最短距离
迪杰斯特拉算法 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是 ...
随机推荐
-
Qt设计师学习笔记--Sharping-Changing Dialogs
1.pushbutton->default属性为true,按回车相当于点击该按钮. 2.选中checkable后,Button变成切换按钮(toggle button),可以有两种状态:按下/弹 ...
-
设计模式 单件-Singleton
单件模式 Singleton 什么时候使用?当需要独一无二的对象时,请想起他. 举例:线程池(threadpool),缓存(cache),对话框,处理偏好设置和注册表(registry)的对象,驱动程 ...
-
老李秘技:loadrunner11是否还支持dblib协议?
老李秘技:loadrunner11是否还支持dblib协议? Loadrunner11不再支持Sybase CTLIB 和 DBLIB协议 在loadrunner安装文件中找到*. LRP文件,位 ...
-
(转)Linux修改SSH登录欢迎语
场景:感觉这样做挺个性的,做个记录! 1 Linux修改SSH的欢迎语 众所周知,Linux系统并没有像Windows一样自带远程桌面连接,虽然可以通过后期安装VNC之类的软件来弥补这个缺点,但用了L ...
-
使用JWT的OAuth2的SSO分析
参考:https://github.com/spring-guides/tut-spring-security-and-angular-js/blob/master/oauth2/README.ado ...
-
web service 部 分
1 .WEB SERVICE 名 词 解 释 .JSWDL 开 发 包 的 介 绍 .JAXP .JAXM 的 解 释 . SOAP .UDDI,WSDL 解 释 . Web ServiceWeb S ...
-
C#/JS AES字符串加密和解密
往往我们有一种需求:在页面端实现对即将传入到后台端的某些字符串进行加密,然后在后台端对传入进来的字符串做解密.在一些有安全要求的数据传输上会用到此种方式 下面分别列出js端和后台端的加密或解密代码. ...
-
java.lang.instrument 中的premain 实现类的个性化加载(附源代码)
背景 想调用ASM API (用于字节码处理的开源API)对字节码进行处理,目标是实现对java程序运行时各种对象的动态跟踪,并进一步分析各个对象之间的关系(研究前提是目前的UML锁阐释的whole- ...
-
Innodb引擎状态查看
我们的MySQL数据库内的表一般都是Innodb表类型的. mysql>show engine innodb status; (低版本用: show innodb status;) === ...
-
C#笔试题面试题锦集(全)总20篇
前些时候找过一次工作,收集了很多不错的笔试题目.共享一下:) C#笔试题面试题锦集(20) 微软应试题目 (2010-01-15 21:32) C#笔试题面试题锦集(19) 雅虎C#题目 (2010- ...