博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dijkstra算法(迪杰斯塔拉算法)
阅读量:6959 次
发布时间:2019-06-27

本文共 2728 字,大约阅读时间需要 9 分钟。

算法描述:  

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

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

其基本思想是,设置顶点集合S并不断地作贪心选择来扩充这个集合。一个顶点属于集合S当且仅当从源到该顶点的最短路径长度已知。初始时,S中仅含有源。设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度。Dijkstra算法每次从V-S中取出具有最短特殊路长度的顶点u,将u添加到S中,同时对数组dist作必要的修改。一旦S包含了所有V中顶点,dist就记录了从源到所有其它顶点之间的最短路径长度。

代码实现:

#include 
#include
#define MAXVERTEX 20#define INF 65535typedef 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
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;}

  

posted on
2014-12-23 13:05 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/devinblog/p/4179890.html

你可能感兴趣的文章
unigui的UnimDatePicker控件使用经验
查看>>
C# 自定义堆栈进行回文检测的代码
查看>>
采用负责任的人工智能推动业务价值
查看>>
比较实用的wamp配置多站点方法
查看>>
用maven时出现,报错 miss 一些包,但是发现项目里已经引入了,但还是报错
查看>>
Servlet中ServletConfig和ServletContext漫谈
查看>>
为那些在职准备考IE的兄弟们做个参考-乾颐堂张IE执笔
查看>>
JQ中 $(document).scrollTop()、$('html').scrollTop()、 $(window).scrollTop()区别
查看>>
我的友情链接
查看>>
令人眼前一亮的下拉式终端 Tilda & Guake
查看>>
find
查看>>
注册 功能的实现
查看>>
Python - 元组(tuple) 详解 及 代码
查看>>
AsynchronousSocketChannel
查看>>
Linux系统下卸载MySQL(靠谱)
查看>>
IE6尾部重复字符bug , IE6下产生多余字符的BUG
查看>>
ruby学习笔记-基础数据类型
查看>>
湖南省第八届大学生计算机程序设计竞赛试题 题目A 三家人 (未测试)
查看>>
MongoDB 下载 安装 启动
查看>>
我的友情链接
查看>>