数据结构—多源最短路径


原理:参考趣学数据结构

代码:

栈代码:

#pragma once
#include<stdio.h>
#define maxSize 100
typedef struct stack {int * base;int * top;
}stack;
bool init(stack & Stack) {//栈的初始化Stack.base = new int[maxSize];if (!Stack.base) {return false;}Stack.top = Stack.base;return true;
}
bool push(stack & Stack,int e) {//入栈if (Stack.top - Stack.base == maxSize) {//满栈,不能再插入return false;}*(Stack.top) = e;Stack.top++;return true;
}
bool pop(stack & Stack, int &e) {//出栈if (Stack.base == Stack.top) {//栈空return false;}Stack.top--;e = *(Stack.top);return true;
}
int getTop(stack &Stack) {if (Stack.base == Stack.top) {//栈空return -1;}return *(Stack.top - 1);
}
void printStack(stack Stack) {//遍历栈中的元素while (Stack.base != Stack.top) {printf("%d ", *(Stack.top - 1));Stack.top--;}
}
bool empty(stack Stack) {//栈空的判断if (Stack.base == Stack.top) {return true;}return false;
}
void testStack() {//测试栈是否有问题stack Stack;init(Stack);int value;while (1) {scanf_s("%d", &value);if (value == -1) {break;}push(Stack, value);}printStack(Stack);
}

多源最短路径代码:


#include<stdio.h>
#include<stdlib.h>
#include"stack.h"
#define N 100
#define elemType int
//const int MAX_INT = (1 << 31) - 1;
//const int MAX_INT = 0X7fffffff;
#define  INF    (((unsigned int)(-1)) >> 1)
typedef struct GraphMatrix {elemType vNode[N][N];int vNum, eNum;
}GraphMatrix;
void findPath(GraphMatrix G, int dist[N][N], int p[N][N],stack &Stack);//声明
void initGMaxtix(GraphMatrix &G) {//初始化邻接矩阵printf("输入顶点数和边数\n");scanf_s("%d%d", &G.vNum, &G.eNum);for (int i = 0; i < G.vNum; i++) {//初始化邻接矩阵for (int j = 0; j < G.vNum; j++) {G.vNode[i][j]= INF;}}printf("输入顶点v1到顶点v2和其边的权重\n");for (int i = 0; i < G.eNum; i++) {int v1, v2, weights;scanf_s("%d%d%d", &v1, &v2, &weights);G.vNode[v1][v2]  = weights;}
}
void print10(GraphMatrix G) {printf("邻接矩阵如下:\n");for (int i = 0; i < G.vNum; i++) {for (int j = 0; j < G.vNum; j++) {printf("%d ", G.vNode[i][j]);}printf("\n");}
}
void print101(int result[N][N], int length) {for (int i = 0; i < length; i++) {for (int j = 0; j < length; j++) {printf("%d ", result[i][j]);}printf("\n");}printf("\n");
}
void Floyd(GraphMatrix G) {//多源最短路径求解int dist[N][N], p[N][N];//分别为多源点到其他点的距离和这段距离所经过的那些顶点的记录数组pfor (int i = 0; i < G.vNum; i++) {for (int j = 0; j < G.vNum; j++) {dist[i][j] = G.vNode[i][j];if (G.vNode[i][j] == INF || i==j ) {//对距离数组和记录数组初始化p[i][j] = -1;}else {p[i][j] = i;}}}for(int k=0;k<G.vNum;k++){for (int i = 0; i < G.vNum; i++) {//更新距离数组for (int j = 0; j < G.vNum; j++) {//注意INF+INF越界问题  如果没有发现多调试if (dist[i][k]<INF && dist[k][j]<INF && dist[i][k] + dist[k][j] < dist[i][j]) {dist[i][j] = dist[i][k] + dist[k][j];p[i][j] = p[k][j];}}}}//print101(dist, G.vNum);stack Stack;init(Stack);printf("输出多源最短路径的最优方案\n");findPath(G, dist, p,Stack);
}
void findPath(GraphMatrix G, int dist[N][N], int p[N][N], stack &Stack) {for (int i = 0; i < G.vNum; i++) {for (int j = 0; j < G.vNum; j++) {if (p[i][j] == -1) {//起点到起点printf("%d---%d不可达!\n", i, j);continue;}push(Stack, j);int x = p[i][j];while (x != -1) {//入栈查找路径push(Stack, x);x = p[i][x];}int e;while (!empty(Stack)) {//出栈遍历路径printf("%d", getTop(Stack));pop(Stack, e);if (Stack.top - Stack.base >= 1) {printf("---");}}printf(" 这段路径的距离为:%d\n", dist[i][j]);}}
}
int main() {GraphMatrix G;initGMaxtix(G);print10(G);printf("\n");Floyd(G);system("pause");return 0;
}

测试截图:

时间复杂度为O(n x n x n),空间复杂度为O(n x n)

如果存在什么问题,欢迎批评指正!谢谢!

数据结构---多源最短路径相关推荐

  1. 数据结构----单源最短路径Dijkstra

    数据结构----单源最短路径Dijkstra 原理:参考趣学数据结构 代码: stack.h 栈代码 #pragma once #include<stdio.h> #define maxS ...

  2. 单源最短路径算法java_数据结构 - 单源最短路径之迪杰斯特拉(Dijkstra)算法详解(Java)...

    给出一个图,求某个端点(goal)到其余端点或者某个端点的最短路径,最容易想到的求法是利用DFS,假设求起点到某个端点走过的平均路径为n条,每个端点的平均邻接端点为m,那求出这个最短路径使用DFS算法 ...

  3. 【2023王道数据结构】【图】通过C++实现图的BFS(广度优先遍历)算法求单源最短路径问题C、C++完整实现(可直接运行)

    ~~~笔锋至此又怎能平淡而终,故事开始便不承认普通✌✌✌ ✌ 题目及题解持续更新中 [2023王道数据结构目录]课后算法设计题C.C++代码实现完整版大全 题目: 通过C++实现图的BFS(广度优先遍 ...

  4. 【PAT数据结构与算法题目集】 旅游规划(单源最短路径,长度+路径查找)

    [PAT数据结构与算法题目集] 旅游规划(单源最短路径,长度+路径查找) 题目 有了一张自驾旅游路线图,你会知道城市间的高速公路长度.以及该公路要收取的过路费.现在需要你写一个程序,帮助前来咨询的游客 ...

  5. c语言单源最短路径问题实验报告,数据结构课程设计最短路径问题实验报告-20210320182652.docx-原创力文档...

    IMB standardization office[IMB 5AB- IMBK 08- IMB 2C] IMB standardization office[IMB 5AB- IMBK 08- IM ...

  6. C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)

    上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...

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

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

  8. 数据结构(十五)dijkstra单源最短路径

    1 算法原理 假设图中有顶点V={A,B,C,D,E,F},我们要求取A到其他顶点的最短距离.假设我们要求取定点A到其它顶点的最短路径,先把顶点A到源的距离设置为0,其他的距离设置为无穷大.准备两个集 ...

  9. 数据结构之单源最短路径(迪杰斯特拉算法)-(九)

    最开始接触最短路径是在数据结构中图的那个章节中.运用到实际中就是我在大三参加的一次美赛中,解决中国的水资源问题.所谓单源最短路径,就是一个起点到图中其他节点的最短路径,这是一个贪心算法. 迪杰斯特拉算 ...

最新文章

  1. 【Java】牛客网 链表分割
  2. word使用宏命令批量按比例设置图片大小
  3. 知识图谱前端插件_大型前端项目可持续演进开发的思考
  4. HBuilder完成webApp入门(2)
  5. WPF 虚拟化 VirtualizingWrapPanel 和 VirtualLizingTilePanel
  6. Spring-IOC推导
  7. DataGrip快捷键(执行SQL、格式化SQL)
  8. 哈希冲突常用解决方法
  9. 最新版 INSPINIA IN+ - WebApp Admin Theme v2.7.1,包含asp.net MVC5示例代码,做管理系统最佳的选择。...
  10. 如何在计算机修改wifi密码,wifi修改密码,教您电脑怎么修改wifi密码
  11. 如果你的电脑只能安装三个软件, 你会选择哪三个?
  12. 爆破字典生成器kali之crunch
  13. exactly-once在Flink里的实现
  14. WPF的Shape(形状)、Path(路径)、Drawing(图画)、Visual(可视化对象)
  15. 互联网创业必备工具盘点
  16. unity基础(3)——从Unity Asset store获取资源
  17. 【Banana PI Leaf S3开发板试用体验】MicroPython环境搭建
  18. VirtualBox 虚拟电脑控制台错误
  19. 3DUnity汽车尾气模拟
  20. 使用Jupyter Notebook远程连接服务器

热门文章

  1. 套套原来是这样装袋的,40个机械动图看懂好像并不容易。。。
  2. 那些不回微信的人,都在看什么?
  3. 21张GIF动图让你秒懂数学原理
  4. 掌握神经网络模型的快捷方式
  5. 纠结学哪种编程语言?请看这个回答
  6. java导出mysql数据库失败_利用Java进行MySql数据库的导入和导出
  7. php按时间分组的sql语句,(SQL语句)按指定时间段分组统计
  8. eeprom stm8l 擦除 读写_[STM8L]EEPROM操作读与写
  9. python中summary_python summary_study.py
  10. mongodb默认的用户名密码_设置mongodb的用户名密码 | Think in Drupal