大话数据结构:最短路径算法
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;
}
大话数据结构:最短路径算法相关推荐
- 数据结构——最短路径算法之floyd算法
数据结构--最短路径算法之floyd算法 (一) Flody算法 [前言]:前面的Dijkstra算法用来解决单源最短路径的问题,即:从指定点到图上其他各点的最短路径.那么,如果我们要求图中任意两个结 ...
- 大话数据结构与算法(一)
大话数据结构与算法-程杰 第一章 数据结构绪论 一.基本概念和术语 数据结构:是相互之间存在一种或者多种特定关系的数据元素的集合: 数据:是描述客观事物的符号,是计算机可以操作的对象,是能够被计算机识 ...
- 大话数据结构与算法:基础篇
1.数据结构的重要性 数据结构是计算机软件相关专业的基础课程,几乎可以说,要想从事编程工作,无论是否是科班出身(比如我,标准的非科班人员,我是学医的,哈哈)都不可以绕过数据结构与算法这部分知识. 数据 ...
- 大话数据结构与算法:算法初步1
1.算法的定义: 什么是算法呢?算法是描述解决问题的方法.如今普遍认可的对算法的定义是:算法是解决特定问题求解步骤的描述,在计算机中表现为指令的有限序列,并且每条指令表示一个或多个操作. 对于一个特定 ...
- 大话数据结构之算法 时间复杂度
http://www.cnblogs.com/danyingjie/archive/2011/11/17/2252466.html 时间复杂度用O()来体现,我们称之为大O记法.记做:T(n)=O(f ...
- 读书笔记-《大话数据结构》-算法设计的要求-正确性-文末有福利
2.6.1 正确性 正确性:算法的正确性是指算法至少应该具有输入.输出和加工处理无歧义性.能正确反映问题的需求.能够得到问题的正确答案. 但是算法的"正确"通常在用法上有很大的差别 ...
- 题目 1709: 数据结构-Floyd(弗洛伊德)最短路径算法
参考<大话数据结构-弗洛伊德算法> 题目描述 在带权有向图G中,求G中的任意一对顶点间的最短路径问题,也是十分常见的一种问题. 解决这个问题的一个方法是执行n次迪杰斯特拉算法,这样就可以求 ...
- 数据结构与算法-C++实现
前沿 1.数据结构和算法的理解 答: 我们如何把现实中大量而复杂的问题,以特定的数据类型和特定的存储结构保存到主存储器(内存)中. (注:数据结构解决了数据存储的问题,比如要存储一个班级50人的成绩, ...
- 大话数据结构 第七章 图(二) 最小生成树、最短路径、拓扑排序、关键路径算法
大话数据结构 第七章 图(二) 最小生成树.最短路径.拓扑排序.关键路径算法 最小生成树 定义 Prim算法 Kruskal算法 最短路径 Dijkstra算法 Floyd算法 拓扑排序 AOV网 拓 ...
最新文章
- 福利 | Python、深度学习、机器学习、TensorFlow 好书推荐
- linux 解压 目录,linux 中目录、文件的解压缩
- 在tomcat新建html页面,仅将HTML,CSS网页部署到Tomcat(示例代码)
- 如何通过Keil将程序正确的下载进flash中
- lucene 索引优化
- 【java作业】2、 编写两个函数,分别使用字节流、字符流实现文件的拷贝;点击按钮,将第三个文本框的字符串的值设置为第一个文本框的字符串+第二个文本框的字符串。
- rabbitmq 在centos下的安装
- Android开发之git命令创建tag提交远程仓库的方法(图文教程)
- mysql慢日志管理
- devops 开发_开发五年,DevOps手册问世
- 服务器性能优化的8种常用方法
- leetcode934.ShortestBridge
- 安卓恶意软件Skygofree爆发,连你的照片都能监控到
- 微电子学与计算机期刊2019,微电子与通信工程学院研究生两篇论文被人工智能顶级会议AAAI 2019接收...
- sed截取连接数升高时的慢日志
- 我的Ubuntu计算机出现“黑屏”,何故?
- 数据结构课设 (快餐店 POS 机计费系统、成绩分析、算术表达式)
- html5网页特效-水墨动画
- ELK系列之Mac安装kibana报错License information could not be obtained from Elasticsearch due to [invalid_inde
- Day9之深浅拷贝大法
热门文章
- 怪怪设计论闲谈篇:职责与解耦的矛盾
- XCTF-高手进阶区:bug
- WEB前端 实现图片懒加载 echo.js
- (八)数据结构之“树”
- (五) : iview 时间选择器,校验不成功
- 过直线上一点画垂线图_苏教版四年级数学上册8.5认识垂直、点到直线的距离微课视频 | 练习...
- vue click同时传入事件对象和自定义参数
- 查看并开启MySQL的log-bin和general_log日志
- Jenkins的入门(二)配置
- Could not install from “echarts\lib\visual\dataColor“ as it does not contain a package.json file.