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



原理:参考趣学数据结构



代码:


stack.h 栈代码


#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);
}

dijkstra.cpp


#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[], int p[], int u, 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] = G.vNode[j][i]=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] = G.vNode[v2][v1] = weights;}
}
void print4(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 print41(int result[], int length) {for (int i = 0; i < length; i++) {printf("%d ", result[i]);}printf("\n");
}
void Dijkstra(GraphMatrix G, int u) {//单源最短路径,分为两个集合求解bool flag[N];//标识是否加入第一个顶点集int dist[N], p[N];//分别为单源点到其他点的距离和这段距离所经过的那些顶点的记录数组pp[u] = -1;dist[u] = 0;for (int i = 0; i < G.vNum; i++) {flag[i] = false;//每一个顶点都默认没有访问dist[i] = G.vNode[u][i];if (G.vNode[u][i]==INF) {//对距离数组和记录数组初始化p[i] = -1;}else {p[i] = u;}}flag[u] = true;for (int i = 0; i < G.vNum - 1; i++) {//G.vNum-1次连接//找没有被访问的最小元素int min=INF;int t=u;for (int j = 0; j < G.vNum; j++) {if (!flag[j] && dist[j] < min) {t = j;min = dist[j];}}if (t == u) {break;//全部顶点加入到第一个顶点集合中}flag[t] = true;//加入到第一个顶点集合中//更新距离数组for (int j = 0; j < G.vNum; j++) {if (!flag[j] && dist[t] + G.vNode[t][j] < dist[j]) {dist[j] = dist[t] + G.vNode[t][j];p[j] = t;}}}//print41(dist, G.vNum);stack Stack;init(Stack);printf("输出单源最短路径的最优方案\n");findPath(G, dist, p, u, Stack);
}
void findPath(GraphMatrix G,int dist[], int p[],int u,stack &Stack) {for (int i = 0; i < G.vNum; i++) {if (p[i]==-1) {//起点到起点printf("%d---%d不可达!\n",u,i);continue;}push(Stack, i);int x = p[i];while (x != -1) {//入栈查找路径push(Stack, x);x = p[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]);}
}
int main() {GraphMatrix G;initGMaxtix(G);print4(G);printf("\n");Dijkstra(G,0);system("pause");return 0;
}

测试截图:

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

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

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

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

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

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

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

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

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

  4. 单源最短路径Dijkstra算法的思想、详细步骤、代码

    目录 一.算法思想 二.算法详细步骤 三.伪代码 + C++代码 四.算法复杂度分析 五.算法改进 六.应用案例 一.算法思想 1.Dijkstra 算法是用来求解单源最短路径问题的经典算法,其本质上 ...

  5. 单源最短路径-Dijkstra(迪杰斯特拉算法)

    迪杰斯特拉算法时间复杂度为O(n^2),其中n为顶点个数. 该算法用于求单源最短路径.并且图中的边不允许带负权值. #include <iostream> using namespace ...

  6. 单源最短路径dijkstra算法

    介绍 dijkstra算法也是解决单源最短路径问题的一种方法.它要求图中路径都是非负的.而且,它的效率要高于bellman算法. 实现 首先定义图的结点信息和边信息. struct _Node;typ ...

  7. NYOJ有趣的问题(单源最短路径dijkstra)

    思路:这题的难度主要是在建图上,建完图之后就是求单源最短路径问题.可用dijkstra算法.要注意他给出的墙的x坐标不是有序 的. #include<stdio.h> #include&l ...

  8. 单源顶点最短路径java_单源最短路径-Dijkstra 算法

    Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问题:求a点到各个点的最短距离,如下图 ...

  9. JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法

    一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...

最新文章

  1. 单步调试_keil for arm 调试时无法单步运行及打断点
  2. typeError: unhashable type: 'list’问题分析
  3. linux环境下中文乱码问题
  4. github可视化_Github上 10 个超好看可视化面板
  5. mysql 服务器 kill进程_mysql查询结束进程kill
  6. Java(19)JDBC
  7. java学生考勤代码免费,基于jsp的学生考勤管理-JavaEE实现学生考勤管理 - java项目源码...
  8. apachecommon连接mysql_使用 apache common dbcp +common pool+mysql连接无效的问题
  9. 使用Material Design的Flutter应用
  10. 循环中需要调用异步怎么确保执行完再执行其他的_什么是事件循环和异步编程?5种使用async/await更好地编码方式!...
  11. 塞班S60v3版平台手机证书权限内容大解析
  12. 《Linux 命令行大全》
  13. unity2018关联不到vs_vs2015与unity2018兼容性问题
  14. griddata三维空间插值
  15. 全国海关分区图(含副厅)
  16. 敏捷开发vs 传统开发
  17. 缅甸投资环境及法律政策简介
  18. 小团队管理核心(一)
  19. C++实验4-项目7穷举法解决组合问题-百钱百鸡问题
  20. MIT线性代数1806(8) 矩阵 秩 特解 通解

热门文章

  1. Android插件化开发之动态加载技术系列索引
  2. php json -gt;访问,【转】Php+ajax+jsonp解决ajax跨域问题
  3. 一分钟教你用Excel从统计局抓数据!
  4. 像小猪佩奇那样生活,需要多少钱?
  5. 程学旗 计算机,徐明伟-青年科学家奖-中国计算机学会
  6. 为什么ps图片打开是色块_PS教程 我的PS我做主之山村调色
  7. twitter mysql_twitter-mysql改进点
  8. c语言两个长整数相加,二个超长正整数的相加
  9. JAVA中pin什么意思_java语言中的多态概述
  10. php 覆盖相同键的值,php - PHP数组使用相同的字符串键组合值 - SO中文参考 - www.soinside.com...