dijkstra最短路径算法

迪杰斯特算法的核心是首先正向把离起点最近的点一个一个找出来,然后从终点开始逆向计算最短路径
利用图数据结构实现dijkstra算法的伪代码如下

{记录所有点到起点的距离并保存到数组D中,有直接连接的就是图中边的权值,
没有直接连接的就是无穷大(起点到起点本身距离为0,后面的计算不考虑本身)}
创建一个数组F记录顶点是否已经计算离顶点最近的距离
创建一个保存路径的数组P
循环顶点个数的次数{{找到一个没有计算与顶点最近的距离的顶点k但是其在距离记录数组D中距离顶点D最近,将其在数组D中的值作为其距离顶点最近的距离,并在数组F中标记其为以计算最近距离}将于K有连接的顶点w在距离D中的值更新,如果通过顶点K,距离D中的值变小就更新,p[w]=k}
循环结束,最短路径距离在D中,路径在P中
#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0#define MAXEDGE 20
#define MAXVEX 20
#define INFINITY 65535typedef int Status;   /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef struct
{int vexs[MAXVEX];int arc[MAXVEX][MAXVEX];int numVertexes, numEdges;
}MGraph;typedef int Patharc[MAXVEX];    /* 用于存储最短路径下标的数组 */
typedef int ShortPathTable[MAXVEX];/* 用于存储到各点最短路径的权值和 *//* 构件图 */
void CreateMGraph(MGraph* G)
{int i, j;/* printf("请输入边数和顶点数:"); */G->numEdges = 16;G->numVertexes = 9;for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{G->vexs[i] = i;}for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{for (j = 0; j < G->numVertexes; j++){if (i == j)G->arc[i][j] = 0;elseG->arc[i][j] = G->arc[j][i] = INFINITY;}}G->arc[0][1] = 1;G->arc[0][2] = 5;G->arc[1][2] = 3;G->arc[1][3] = 7;G->arc[1][4] = 5;G->arc[2][4] = 1;G->arc[2][5] = 7;G->arc[3][4] = 2;G->arc[3][6] = 3;G->arc[4][5] = 3;G->arc[4][6] = 6;G->arc[4][7] = 9;G->arc[5][7] = 5;G->arc[6][7] = 2;G->arc[6][8] = 7;G->arc[7][8] = 4;for (i = 0; i < G->numVertexes; i++){for (j = i; j < G->numVertexes; j++){G->arc[j][i] = G->arc[i][j];}}}
/*  Dijkstra算法,求有向网G的v0顶点到其余顶点v的最短路径P[v]及带权长度D[v] */
/*  P[v]的值为前驱顶点下标,D[v]表示v0到v的最短路径长度和 */void ShortestPth_Dijkstra(MGraph G, int v0, Patharc* P, ShortPathTable* D)
{int v, w, k, min;int final[MAXVEX];/* final[w]=1表示求得顶点v0至vw的最短路径 */for (v = 0; v < G.numVertexes; v++)    /* 初始化数据 */{final[v] = 0;            /* 全部顶点初始化为未知最短路径状态 */(*D)[v] = G.arc[v0][v];/* 将与v0点有连线的顶点加上权值 */(*P)[v] = -1;               /* 初始化路径数组P为-1  */}(*D)[v0] = 0;  /* v0至v0路径为0 */final[v0] = 1;    /* v0至v0不需要求路径 *//* 开始主循环,每次求得v0到某个v顶点的最短路径 ,并且更新之前的距离*/for (int v = 1; v < G.numVertexes; v++){min = INFINITY; /* 当前所知离v0顶点的最近距离 */        for (int w = 0; w < G.numVertexes; w++){if (!final[w] && (*D)[w] < min ) // 找到还没有计算距离V0点的中最近的点{k = w;min = (*D)[w];}}final[k] = 1;    /* 将目前找到的最近的顶点置为1 ,表示已经计算了距离*///因为新找到了点,对之前所有确定距离的点更新距离for (int w = 0; w < G.numVertexes; w++){/* 如果经过v顶点的路径比现在这条路径的长度短的话 */if (!final[w] && (min + G.arc[k][w] < (*D)[w])){ /*  说明找到了更短的路径,修改D[w]和P[w] */(*D)[w] = min + G.arc[k][w];  /* 修改当前路径长度 */(*P)[w] = k;}}}
}int main(void)
{int i, j, v0;MGraph G;Patharc P;ShortPathTable D; /* 求某点到其余各点的最短路径 */v0 = 0;CreateMGraph(&G);ShortestPth_Dijkstra(G, v0, &P, &D);printf("最短路径倒序如下:\n");for (i = 1; i < G.numVertexes; ++i){printf("v%d - v%d : ", v0, i);j = i;while (P[j] != -1){printf("%d ", P[j]);j = P[j];}printf("\n");}printf("\n源点到各顶点的最短路径长度为:\n");for (i = 1; i < G.numVertexes; ++i)printf("v%d - v%d : %d \n", G.vexs[0], G.vexs[i], D[i]);return 0;
}

floyd算法

算法的核心操作和dijkstra算法类似,都是先建立一个距离矩阵D和路径矩阵P,然后不断更新两个矩阵。

#include "stdio.h"
#include "stdlib.h"
#include "io.h"
#include "math.h"
#include "time.h"#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXEDGE 20
#define MAXVEX 20
#define INFINITY 65535typedef int Status;   /* Status是函数的类型,其值是函数结果状态代码,如OK等 */typedef struct
{int vexs[MAXVEX];int arc[MAXVEX][MAXVEX];int numVertexes, numEdges;
}MGraph;typedef int Patharc[MAXVEX][MAXVEX];
typedef int ShortPathTable[MAXVEX][MAXVEX];/* 构件图 */
void CreateMGraph(MGraph* G)
{int i, j;/* printf("请输入边数和顶点数:"); */G->numEdges = 16;G->numVertexes = 9;for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{G->vexs[i] = i;}for (i = 0; i < G->numVertexes; i++)/* 初始化图 */{for (j = 0; j < G->numVertexes; j++){if (i == j)G->arc[i][j] = 0;elseG->arc[i][j] = G->arc[j][i] = INFINITY;}}G->arc[0][1] = 1;G->arc[0][2] = 5;G->arc[1][2] = 3;G->arc[1][3] = 7;G->arc[1][4] = 5;G->arc[2][4] = 1;G->arc[2][5] = 7;G->arc[3][4] = 2;G->arc[3][6] = 3;G->arc[4][5] = 3;G->arc[4][6] = 6;G->arc[4][7] = 9;G->arc[5][7] = 5;G->arc[6][7] = 2;G->arc[6][8] = 7;G->arc[7][8] = 4;for (i = 0; i < G->numVertexes; i++){for (j = i; j < G->numVertexes; j++){G->arc[j][i] = G->arc[i][j];}}}/* Floyd算法,求网图G中各顶点v到其余顶点w的最短路径P[v][w]及带权长度D[v][w] */
void ShortestPath_Floyd(MGraph G, Patharc* P, ShortPathTable* D)
{int v, w, k;for (int v = 0; v < G.numVertexes; ++v){for (int w = 0; w < G.numVertexes; ++w){(*D)[v][w] = G.arc[v][w]; /* D[v][w]值即为对应点间的权值 */(*P)[v][w] = w;             /* 初始化P */}}for (int k = 0; k < G.numVertexes; ++k){for (int v = 0; v < G.numVertexes; ++v){for (int w = 0; w < G.numVertexes; ++w){if ((*D)[v][w] > (*D)[v][k] + (*D)[k][w]){/* 如果经过下标为k顶点路径比原两点间路径更短 ,就更新距离矩阵D*/(*D)[v][w] = (*D)[v][k] + (*D)[k][w];/* 将当前两点间权值设为更小的一个 */(*P)[v][w] = (*P)[v][k];/* 路径设置为经过下标为k的顶点,前驱顶点 */}}}}
}
int main(void)
{int v, w, k;MGraph G;Patharc P;ShortPathTable D; /* 求某点到其余各点的最短路径 */CreateMGraph(&G);ShortestPath_Floyd(G, &P, &D);printf("各顶点间最短路径如下:\n");for (v = 0; v < G.numVertexes; ++v){for (w = v + 1; w < G.numVertexes; w++){printf("v%d-v%d weight: %d ", v, w, D[v][w]);k = P[v][w];             /* 获得第一个路径顶点下标 */printf(" path: %d", v);  /* 打印源点 */while (k != w)               /* 如果路径顶点下标不是终点 */{printf(" -> %d", k);    /* 打印路径顶点 */k = P[k][w];           /* 获得下一个路径顶点下标 */}printf(" -> %d\n", w);   /* 打印终点 */}printf("\n");}printf("最短路径D\n");for (v = 0; v < G.numVertexes; ++v){for (w = 0; w < G.numVertexes; ++w){printf("%d\t", D[v][w]);}printf("\n");}printf("最短路径P\n");for (v = 0; v < G.numVertexes; ++v){for (w = 0; w < G.numVertexes; ++w){printf("%d ", P[v][w]);}printf("\n");}return 0;
}

大话数据结构:最短路径算法相关推荐

  1. 数据结构——最短路径算法之floyd算法

    数据结构--最短路径算法之floyd算法 (一) Flody算法 [前言]:前面的Dijkstra算法用来解决单源最短路径的问题,即:从指定点到图上其他各点的最短路径.那么,如果我们要求图中任意两个结 ...

  2. 大话数据结构与算法(一)

    大话数据结构与算法-程杰 第一章 数据结构绪论 一.基本概念和术语 数据结构:是相互之间存在一种或者多种特定关系的数据元素的集合: 数据:是描述客观事物的符号,是计算机可以操作的对象,是能够被计算机识 ...

  3. 大话数据结构与算法:基础篇

    1.数据结构的重要性 数据结构是计算机软件相关专业的基础课程,几乎可以说,要想从事编程工作,无论是否是科班出身(比如我,标准的非科班人员,我是学医的,哈哈)都不可以绕过数据结构与算法这部分知识. 数据 ...

  4. 大话数据结构与算法:算法初步1

    1.算法的定义: 什么是算法呢?算法是描述解决问题的方法.如今普遍认可的对算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 对于一个特定 ...

  5. 大话数据结构之算法 时间复杂度

    http://www.cnblogs.com/danyingjie/archive/2011/11/17/2252466.html 时间复杂度用O()来体现,我们称之为大O记法.记做:T(n)=O(f ...

  6. 读书笔记-《大话数据结构》-算法设计的要求-正确性-文末有福利

    2.6.1 正确性 正确性:算法的正确性是指算法至少应该具有输入.输出和加工处理无歧义性.能正确反映问题的需求.能够得到问题的正确答案. 但是算法的"正确"通常在用法上有很大的差别 ...

  7. 题目 1709: 数据结构-Floyd(弗洛伊德)最短路径算法

    参考<大话数据结构-弗洛伊德算法> 题目描述 在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题. 解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求 ...

  8. 数据结构与算法-C++实现

    前沿 1.数据结构和算法的理解 答: 我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中. (注:数据结构解决了数据存储的问题,比如要存储一个班级50人的成绩, ...

  9. 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法

    大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...

最新文章

  1. 福利 | Python、深度学习、机器学习、TensorFlow 好书推荐
  2. linux 解压 目录,linux 中目录、文件的解压缩
  3. 在tomcat新建html页面,仅将HTML,CSS网页部署到Tomcat(示例代码)
  4. 如何通过Keil将程序正确的下载进flash中
  5. lucene 索引优化
  6. 【java作业】2、 编写两个函数,分别使用字节流、字符流实现文件的拷贝;点击按钮,将第三个文本框的字符串的值设置为第一个文本框的字符串+第二个文本框的字符串。
  7. rabbitmq 在centos下的安装
  8. Android开发之git命令创建tag提交远程仓库的方法(图文教程)
  9. mysql慢日志管理
  10. devops 开发_开发五年,DevOps手册问世
  11. 服务器性能优化的8种常用方法
  12. leetcode934.ShortestBridge
  13. 安卓恶意软件Skygofree爆发,连你的照片都能监控到
  14. 微电子学与计算机期刊2019,微电子与通信工程学院研究生两篇论文被人工智能顶级会议AAAI 2019接收...
  15. sed截取连接数升高时的慢日志
  16. 我的Ubuntu计算机出现“黑屏”,何故?
  17. 数据结构课设 (快餐店 POS 机计费系统、成绩分析、算术表达式)
  18. html5网页特效-水墨动画
  19. ELK系列之Mac安装kibana报错License information could not be obtained from Elasticsearch due to [invalid_inde
  20. Day9之深浅拷贝大法

热门文章

  1. 怪怪设计论闲谈篇:职责与解耦的矛盾
  2. XCTF-高手进阶区:bug
  3. WEB前端 实现图片懒加载 echo.js
  4. (八)数据结构之“树”
  5. (五) : iview 时间选择器,校验不成功
  6. 过直线上一点画垂线图_苏教版四年级数学上册8.5认识垂直、点到直线的距离微课视频 | 练习...
  7. vue click同时传入事件对象和自定义参数
  8. 查看并开启MySQL的log-bin和general_log日志
  9. Jenkins的入门(二)配置
  10. Could not install from “echarts\lib\visual\dataColor“ as it does not contain a package.json file.