最短路径----狄克斯特拉 (digkstra)+邻接矩阵:

采用邻接矩阵的存储方式存储。算法主要用到了三个数组:
disp[],path和s数组。 disp数组主要是存储最短路径长度,path存储最短路径上当前顶点的前一个顶点,s用来标志顶点是否处理过。

其中主要有两步:循环找(找符合条件的顶点),循环改(改顶点对应的disp,path的值),其他细节均在代码中写出,注意的是,算法的动态过程可以优先理解一下,再来理解下面的代码。

代码如下:

#include <stdio.h>
#include <malloc.h>
#define inf 330
#define max 50typedef struct  node{int no;
}bnode;//顶点结构体 typedef struct graph{int a[max][max];int e,n;bnode nu[max];
}G;//邻接矩阵结构体 //创建邻接矩阵
void create(G &g, int b[max][max], int n, int e)
{ int i ,j;g.e =e;//边数 g.n =n;//顶点数 for(i = 0; i<n; i++){for(j = 0; j <n; j++)g.a[i][j] = b[i][j];   }for(int i=0; i<n; i++)g.nu[i].no = i;
}void show(G g)
{int i ,j;printf("创建的邻接矩阵:\n");//下面代码段是显示矩阵的行列标识 printf("    ");for(int i =0; i<g.n; i++)printf("%d  ",i);printf("\n");for(i =0; i<g.n; i++){printf("%d: ",i); for(j=0; j<g.n; j++){if(g.a[i][j] == inf)printf(" ∞") ;elseprintf(" %d ",g.a[i][j]);}printf("\n");}printf("\n%d个顶点,%d条边 \n",g.n, g.e);
}//输出路径
/*两步:第一输出对应的v,i,disp[i]第二循环找到最短路径的所有点*/
void showdis(G g, int disp[], int path[], int s[], int v)
{int apath[max];int d;int k;for(int i =0; i<g.n; i++)if(s[i]==1&& i!=v){printf("路径%d ---> 路径%d  的长度: %d  路径为:", v,i,disp[i]);//循环将路径值存入apath中,最后逆序输出 d=0;apath[d]=i; //注意,这里是将 i 存入数组中 k = path[i];if(k==-1) printf("没有路径\n");else{while(k!=v) //在path一直往前找。一直到起始顶点 {apath[++d]=k;k = path[k];}//最后将起始顶点也存储到数组中 apath[++d] = v;//这里先输出一个值是因为下面的  -> 这个符号前面必须要输出一个数字。 printf("%d",apath[d]);for(int j = d-1; j>=0; j--)printf("->%d ",apath[j]);printf("\n");}    }} //狄克斯特拉算法
/*算法定义了三个数组disp,path,s
主要是 一:对三个数组的初始化, 二:将编号为 0 的顶点选中 ,三:循环寻找最近权值最小的顶点 ,之后将其s修改为 1 四:循环修改没处理过的顶点的对应的disp与path
*/
void dijkstra(G g, int v)
{int disp[max]; //存放最短边值 int path[max];//最当最短路劲下的当前顶点的前一个顶点 int s[max];//判断是不是已经处理过的顶点,0表示没有,1表示处理过了 //这个循环是对三个数组进行初始化 for(int i =0; i<g.n; i++){disp[i] = g.a[v][i];s[i] = 0;if(g.a[v][i]<inf)path[i] = v;else path[i] = -1;//这里表示标号为v的,以及顶点到初始点的值为inf的 都初始化为-1。 }//选取第一个0编号的顶点 s[v]=1;path[v] = 0;//这个循环是在g.n-1条边下寻找 for(int i =0; i<g.n-1; i++){int u;//找最小的int min= inf;//寻找边值最小同时也是最近的顶点 for(int j=0; j<g.n; j++)if(s[j]==0 && disp[j] <min){u = j; //记录顶点编号 min = disp[j];} //找到就将s置为1,表示处理过了 s[u] =1;//这个循环是在没处理过的顶点里,修改相应的disp与path的值 for(int j =0; j<g.n; j++)if(s[j] == 0 && g.a[u][j]<inf && g.a[u][j]+disp[u] <disp[j]){disp[j] = g.a[u][j] + disp[u];path[j] =u;}}printf("\n分别输出 disp, path, s 三个数组值:\n"); for(int i =0; i<g.n; i++){printf("%d ",disp[i]);} printf("\n");for(int i =0; i<g.n; i++){printf("%d ",path[i]);} printf("\n");for(int i =0; i<g.n; i++){printf("%d ",s[i]);} printf("\n\n");//构造完成之后输出路劲showdis(g,disp,path,s,v);
}int main()
{G g; //注意,这里创建的是结构体类型变量,如果是结构体指针的话,创建的矩阵就是链式 int a[max][max]={{0,5,inf,7,inf,inf},{inf,0,4,inf,inf,inf},{8,inf,0,inf,inf,9},{inf,inf,5,0,inf,6},{inf,inf,inf,5,0,inf},{3,inf,inf,inf,1,0}};int  n=6, e=10;//创建邻接矩阵 create(g,a,n,e);show(g);dijkstra(g,0);return 0;
}

程序运行如下:

最短路径----狄克斯特拉 (digkstra)+邻接矩阵相关推荐

  1. 最短路径--狄克斯特拉(Dijkstra)算法

    最短路径 从图中的某个顶点出发到达另外一个顶点的所经过的边的权重和最小的一条路径,称为最短路径 Dijkstra算法 算法来源 Dijkstra算法是由一个叫Dijkstra的荷兰人发明的,故称此算法 ...

  2. 用狄克斯特拉算法计算带权最短路径

    目录 用狄克斯特拉算法计算带权最短路径 狄克斯特拉算法思想 举一个栗子:起点到终点 举二个栗子:换钢琴 Warning 代码代码代码 python C JAVA 图文来源 用狄克斯特拉算法计算带权最短 ...

  3. 算法学习之狄克斯特拉算法

    加权图 在了解狄克斯特拉算法之前,先介绍一下加权图. 如图,假设你要从起点出发到达终点,如果只考虑换乘少,即最短路径.那么可以使用广度优先搜索算法,该算法我之前简单的写过,链接点这里.但是,现在你要找 ...

  4. 算法图解-狄克斯特拉算法

    本章内容: 加权图-提高或者降低某些边的权重 狄克斯特拉算法,能找出加权图中前往x的最短路径 图中的环,它导致狄克斯特拉算不管用 7.1狄克斯特拉算法 4个步骤: 找出最便宜的节点,即最短时间内前往的 ...

  5. 狄克斯特拉(Dijkstra)算法详解

    1.前言 最近在看<算法图解>,其中第七章狄克斯特拉算法个人感觉并没有讲的清楚,比如看完7.1节给人的感觉是狄克斯特拉算法会遍历图中的每一条边,后续狄克斯特拉不适用负权边的说法就站不住脚了 ...

  6. Dijkstra(狄克斯特拉)求加权重的邻接矩阵最短路径(初级版)

    算法 参考资源:https://www.geeksforgeeks.org/dijkstras-shortest-path-algorithm-greedy-algo-7/ 百度百科:迪杰斯特拉算法是 ...

  7. 狄克斯特拉--最短路径问题

    Dijkstra's algorithm 最短路径问题 算法思路 代码实现 最短路径问题 如下图所示,求解从起点到终点的最短路径. #mermaid-svg-26k5ICvfEHYoNbf5 {fon ...

  8. 最短路径--Dijkstra(狄克斯特拉)算法

    最短路径 路径的概念:       在一个无权的图中,若从一顶点到另一顶点存在着一条路径,则称该路径长度为该路径上所经过的边的数目,它等于该路径上的顶点数减 1 .        由于从一顶点到另一顶 ...

  9. 狄克斯特拉(Dijkstra)算法求一个顶点到其余各个顶点的最短路径

    不要自卑,去提升实力 互联网行业谁技术牛谁是爹 如果文章可以带给你能量,那是最好的事!请相信自己 加油o~ 1.狄克斯特拉(Dijkstra)算法 采用狄克斯特拉(Dijkstra)算法可以求带权图( ...

最新文章

  1. Python:新浪网分类资讯爬虫
  2. 别写Bug了!赶紧把今天的垃圾给我分类了!
  3. python数组改变维数
  4. windows10详细配置pcl-1.8.1
  5. 多线程下C#如何保证线程安全?
  6. LeetCode Algorithm 203. 移除链表元素
  7. javaweb学习总结(三十九):数据库连接池
  8. 这届毕业生薪资高,是真的
  9. 程序员,与工程师的区别在哪里? (3)
  10. OpenCV kmeans代码
  11. JZOJ 5914. 盟主的忧虑
  12. pb 判断sql 是否合法_宜信技术|《SQL优化最佳实践》作者带你重新了解SQL
  13. python (元祖\列表\集合\字典)基础用法
  14. 人工智能 一种现代方法 第2章 智能Agent
  15. vue问题解决 extract:echarts: sill extract echarts@^4.2.0-rc.2 extracted to
  16. 【详解】为何三元一次方程可以表示一个平面
  17. 解锁三星bl锁有几种方法_如何判断三星手机bootloader是否解锁_免费解锁BL的3个方法...
  18. “人货场”模型,该怎么搭建?
  19. 【懒人专用】Python实现Modelsim独立仿真Vivado工程的自动化脚本
  20. shp2sdo的下载及使用说明

热门文章

  1. Python基础教程之Python简介
  2. 林轩田机器学习基石笔记5 - Training versus Testing
  3. JVM源码分析之Metaspace解密
  4. 图片转成pdf的免费软件
  5. 深度学习AI美颜系列----人像静态/动态贴纸特效算法实现
  6. PacBio三代测序专业术语解读
  7. Java知识点整理(SE) IO
  8. dlink中设置端口映射图文讲解(解决电驴tcp链接测试失败问题)
  9. CSS3实现流星动画
  10. Android 10 11 删除本地照片方法