Dijkstra算法的原理:

从某个源点到其余各顶点的最短路径,即单源点最短路径(仅适合非负权值图)。单源点最短路径是指:给定带权有向图G和源点v,求从v到G中其余各顶点的最短路径。迪杰斯特拉(Dijkstra)提出了按路径长度递增的顺序产生各顶点的最短路径算法。

该算法的基本思想是:

(1)设置两个顶点的集合S和T=V-S,集合S中存放已找到最短路径的顶点,集合T存放当前还未找到最短路径的顶点;

(2)初始状态时,集合S中只包含源点v0;

(3)从集合T中选取到某个顶点vi(要求vi到v0的路径长度最小)加入到S中;

(4)S中每加入一个顶点vi,都要修改顶点v0到T中剩余顶点的最短路径长度值,它们的值为原来值与新值的较小者,新值是vi的最短路径长度加上vi到该顶点的路径长度;

(5)不断重复(3)和(4),直到S包含全部顶点。

算法设计:

1.首先函数里面运用二维数组cost[n][n]实现图的临界矩阵存储,数组dist[n]表示源点到节点n的最短距离,S[n]表示某一节点n是否已经进入集合S,如果进入则将S[i]置为1,否则为0。pre[n]表示当前节点n的前驱节点(用来输出路径)。

2.在开始遍历之前,首先给数组D[n]赋值为源点到该点的距离,这样便能第一次找到源点到相邻节点的最短距离(dist[i]=cost[v][i];)。

3.下面找出最短距离:

if((!S[j])&&(dist[j]<min))
{
min=dist[j];
u=j;
}

4.更新各节点的最短距离:

for(int k=0;k<n;k++)
{
if((!S[k])&&(dist[k]>dist[u]+cost[u][k]))  //调整未加入S的点的距离值
{
D[k]=D[u]+cost[u][k];
pre[k]=u; //若通过u减小了k的距离值,则修改k的前趋为u
}
}

4.另外,若从原点无法到达顶点x,则令其前趋为-1:pre[x]=-1,在输出判别一下就可以了。还要提醒的一点是输入输出的顶点的标号与实际存储的数组下标相差为1,应该要分辨清楚。

代码实现:

#include<cstdio>
using namespace std;
#define max 10000
#define inf 20000
int n,e;                           //顶点数n,边的条数e
int cost[20][20];                  //临界矩阵
int dist[20];                      //存储最短路径的长度值
int pre[20];                       //存储一个顶点在其最短路径的前趋
int S[20];                         //标志数组,若为已经找到最短路径的结点则为1,否则为0void Dijkstra(int v){for(int i=0;i<n;i++){dist[i]=cost[v][i];        //初始化S[i]=0;                    //标志位初始为0if(dist[i]<max)pre[i]=v;              //若存在边,则前趋为原点elsepre[i]=-1;             //否则,前趋为-1,不可达}S[0]=1;                        //原点标志为1    for(int i=0;i<n-1;i++){        //循环n-1次int u;                     //u为待选顶点int min=inf;         //令初始最小值>max,使距离值为max的顶点也能加到S中for(int j=0;j<n;j++){if((!S[j])&&dist[j]<min){ //寻找距离S最小的顶点umin=dist[j];u=j;}}S[u]=1;                    //将其标志设置为1for(int k=0;k<n;k++){      //调整未加入S的点的的距离值if((!S[k])&&dist[k]>dist[u]+cost[u][k]){dist[k]=dist[u]+cost[u][k];pre[k]=u;          //若通过u减小了k的距离,则修改k的前趋为u}}}printf("\nThe result:\n");     //输出结果for(int i=0;i<n;i++){printf("<%d,%d>:  ",v+1,i+1);int p=pre[i];  if(p!=-1){                 //若可达输出最短路径printf("%d  ",dist[i]);    //输出最短距离printf("%d",i+1);      //根据前趋逆向输出最短路径while(p!=v){printf("<--%d",p+1);p=pre[p];}printf("<--%d",v+1);}else{                      //若不可达则输出“inf”printf("inf");}printf("\n");}
}int main(){printf("Please enter the number of n and e:");scanf("%d%d",&n,&e);for(int i=0;i<n;i++)for(int j=0;j<n;j++)cost[i][j]=max;        //初始化为maxint start,end,dut;for(int i=0;i<e;i++){scanf("%d%d%d",&start,&end,&dut);      //输入边的始点,终点和权值start--;end--;                     //结点号与存储的下标相差1cost[start][end]=dut;}int v=0;Dijkstra(v);                   //以顶点1(即下标为0)为原点vreturn 0;
}

转载于:https://www.cnblogs.com/FrankChen831X/p/10326079.html

最短路径Dijkstra算法(邻接矩阵)相关推荐

  1. 使用邻接矩阵实现有向图最短路径Dijkstra算法

    题目描述: 用邻接矩阵存储有向图,实现最短路径Dijkstra算法,图中边的权值为整型,顶点个数少于10个. 输入描述 首先输入图中顶点个数和边的条数: 再输入顶点的信息(字符型): 再输入各边及其权 ...

  2. 最短路径(单源 dijkstra算法-邻接矩阵)

    //单源最短路径,dijkstra算法,邻接矩阵形式,复杂度O(n^2) //求出源s到所有点的最短路径,参数,传入图的顶点数n,(有向图)邻接矩阵mat //参数,返回到各点的最短距离min[]和路 ...

  3. 最短路径-Dijkstra算法与Floyd算法

    最短路径-Dijkstra算法与Floyd算法 原文:https://www.cnblogs.com/smile233/p/8303673.html 一.最短路径 ①在非网图中,最短路径是指两顶点之间 ...

  4. 最短路径——Dijkstra算法与Floyd算法

    最短路径 Dijkstra算法 C语言代码实现 代码解析 Floyd算法 算法解析 C语言代码实现 最短路径问题 最短路径问题是我们经常会面临的一种决策问题.在图论中,非网图(边没有权值)的最短路径就 ...

  5. 分支限界法:单源最短路径--dijkstra算法

    单源最短路径–dijkstra算法 前面已经多次介绍过dijkstra算法是贪心算法,是动态规划,实际上可以从分支限界的角度来理解: 分支限界法 分支限界法,实际上就是回溯法,一般意义的回溯法是基于深 ...

  6. 最短路径——Dijkstra算法以及二叉堆优化(含证明)

    一般最短路径算法习惯性的分为两种:单源最短路径算法和全顶点之间最短路径.前者是计算出从一个点出发,到达所有其余可到达顶点的距离.后者是计算出图中所有点之间的路径距离. 单源最短路径 Dijkstra算 ...

  7. python棋盘最短路径_Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例...

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  8. 最短路径(Dijkstra算法)(c/c++)

    Dijkstra是一种求单源点最短路径的算法,即求某一个顶点到其余各顶点之间的最短路径,下面采用邻接矩阵来存储图中信息 算法思路为: 1,假设v0是源点,s是已求得最短路径的终点集合,用D[i]来保存 ...

  9. 数据结构与算法—单源最短路径dijkstra算法

    介绍 对于dijkstra算法,很多人可能感觉熟悉而又陌生,可能大部分人比较了解bfs和dfs,而对dijkstra和floyd算法可能知道大概是图论中的某个算法,但是可能不清楚其中的作用和原理,又或 ...

最新文章

  1. 网络工程:2.1.ARP协议与PC间通信
  2. 相当于零负担的延时程序(转)
  3. 【玩转cocos2d-x之七】场景类CCScene和布景类CCLayer
  4. java事件的接收_spring发布和接收定制的事件(spring事件传播)
  5. python实验报告代写价格_代写OS python程序作业、代写代写OS作业、代写OS实验报告...
  6. 准考证打印系统关闭怎么办_2019年执业药师准考证无法正常打印,怎么办?
  7. 大白话讲解如何给github上项目贡献代码
  8. 浏览器 刷新页面后回到顶部_当你在浏览器中,忘记了曾经的登录密码怎么办......
  9. jquery validation用法
  10. Juggling Life and Learning
  11. Spring源码下载---导入到Idea
  12. matlab画填充直方图,matlab使用imhist、plot、fill画可填充颜色连续直方图
  13. 5064. 友好城市
  14. HRSaaS系统和ERP系统有什么区别?
  15. pitch yaw roll 最直观的解释
  16. matlab画某个变量的全球分布
  17. 咸鱼ESP32实例—RTC
  18. 全球与中国1-苄基吡啶嗡-3-羧酸盐市场深度研究分析报告
  19. 云开发校园微社区微信小程序源码/二手交易/兼职交友微信小程序开源功能介绍
  20. 纯前端大数据处理技术:葡萄城纯前端开发工具应用实践

热门文章

  1. 虚拟机centos6.5 --安装jdk
  2. 使用cookies查询商品详情
  3. C#:const 和readonly的区别
  4. 美国本科申请Essay的写作注意事项
  5. Centos7 安装 Kubernetes dashboard (安装篇)
  6. 测试可变字符序列stringBuilder
  7. Docker实践 -- 安装Docker
  8. MongoDB文档查询操作(三)
  9. Android 四大组件之一(Activity)
  10. request的各种方法大全