单源最短路径的迪克斯特拉(Dijkstra)算法
Dijkstra算法
1.定义概览
Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点(节点需为源点)到其他所有节点的最短路径。主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。Dijkstra算法是很有代表性的最短路径算法,注意该算法要求图中不存在负权边。
实例:假设有A,B,C,D四个城市,(这里讨论的是有向网) 它们的距离为: A->B(10),A->C(11),B->D(12),C->D(13);
所谓単源路径就是解决从源点 A开始找出到其他城市的最短距离(除本身外的其他所有城市)。Dijkstra算法可以求出A->B(10),A->C(11),A->D(22);
拓展2:多源最短路径(常用Floyd算法)是解决任意两点间的最短路径的一种算法,(不局限于从源点出发,到其他各个顶点 )可以正确处理有向图或负权的最短路径问题,同时也被用于计算有向图的传递闭包。Floyd算法的时间复杂度为O(N3),空间复杂度为O(N2)。
代码
/*@ Dijkstra算法(単源最短路径)
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define MAXV 100
#define LIMITLESS 9999 //定义为无穷大,默认为节点间不存在联系
using namespace std;
typedef struct
{char info; //顶点其他信息
}VertexType;typedef struct MGraph
{int v; //顶点数int e; //边数int edges[MAXV][MAXV];//邻接矩阵的数组表现VertexType vexs[MAXV]; //顶点信息
}MGraph;void creat(MGraph *G)
{int i, j, k, w;int start, end;printf("请输入顶点数和边数:\n");scanf("%d%d", &(G->v), &(G->e));getchar();printf("请输入顶点信息:\n");for (i = 0; i<G->v; i++){scanf("%c", &(G->vexs[i].info));}for (i = 0; i<G->v; i++){for (j = 0; j<G->v; j++){G->edges[i][j] = LIMITLESS;}}printf("输入图的顶点边的下标值和它的权值:\n");for (k = 0; k<G->e; k++){scanf("%d%d%d", &start, &end, &w);G->edges[start][end] = w;}
}void print(MGraph *G)
{int i, j;printf("顶点数:%d,边数:%d\n", G->v, G->e);printf("%d个顶点的信息:\n", G->v);for (i = 0; i<G->v; i++){printf("%5c",G->vexs[i].info);}printf("\n各个顶点的连接情况:\n");printf("\t");for (i = 0; i<G->v; i++){printf("[%d]\t", i);}printf("\n");for (i = 0; i<G->v; i++){printf("[%d]\t", i);for (j = 0; j<G->v; j++){if (G->edges[i][j] == LIMITLESS){printf("oo\t");}else{printf("%d\t", G->edges[i][j]);}}printf("\n");}
}void Ppath(MGraph *g,int path[], int i, int v) //前向递归查找路径上的顶点,但不包含起点与终点的路径值
{int k;k = path[i];if (k == v) //无中间节点,退出{return;}Ppath(g,path, k, v);printf("%c",g->vexs[k]);
}void Dispath(MGraph *g,int dist[], int path[], int s[], int n, int v)
{int i;for (i = 0; i < n; i++){if (s[i] == 1){printf("从%c到%c的最短路径长度为:%d\t路径为:", g->vexs[v], g->vexs[i], dist[i]);printf("%c",g->vexs[v]); //输出路径上的起点Ppath(g,path, i, v); //输出路径上的中间点printf("%c\n",g->vexs[i]); //输出路径上的终点}else{printf("从%c到%c不存在路径\n", g->vexs[v], g->vexs[i]);}}
}void Dijkstra(MGraph *g, int v)
{int mindis, i, j, u;int s[MAXV]; //表示这个顶点是否存入最短路线中(0表示未加入,1表示已加入)int dist[MAXV]; //表示起始点到此顶点的距离int path[MAXV];//表示此点的上一步是哪一个顶点for (i = 0; i < g->v; i++){s[i] = 0;dist[i] = g->edges[v][i];if (g->edges[v][i] < LIMITLESS){path[i] = v;}else{path[i] = -1;}}s[v] = 1;path[v] = 0;for (i = 0; i < g->v; i++){mindis = LIMITLESS; //mindis置最小长度初值for (j = 0; j < g->v; j++) //选取不在s中且具有最小距离的顶点u{if (s[j] == 0 && dist[j] <mindis){mindis = dist[j];u = j;}}s[u] = 1;for (j = 0; j < g->v; j++){if (s[j] == 0){if (g->edges[u][j] < LIMITLESS&&dist[u] + g->edges[u][j] < dist[j]){dist[j] = dist[u] + g->edges[u][j];path[j] = u;}}}}Dispath(g ,dist, path, s, g->v, v);
}int main(void)
{MGraph *g;g = (MGraph *)malloc(sizeof(MGraph));creat(g);print(g);Dijkstra(g,0);return 0;
}
单源最短路径的迪克斯特拉(Dijkstra)算法相关推荐
- 最短路径之迪克斯特拉(Dijkstra)算法
何谓最短路径 顾名思义就是在一个图中,一个顶点到另外一个顶点的最短距离拉.那么这里有一点要注意,就是在网图中(边的权值各不相同)最短路径指的是俩点之间的连线权值最小:在非网图(边的权值都默认为1)中最 ...
- c++ 单源最短路径-狄杰斯特拉算法
文章目录 源码 输出 狄杰斯特拉算法 适用范围:没有负权重的图, 可以有环,有向无向图均可 求解问题:单源最短路径 时间复杂度:V^2 源码 #include <iostream> #in ...
- 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...
问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...
- 单源最短路径-迪杰斯拉特算法
思路: 在网络中,从某个顶点Vx出发到达另外一个顶点Vi,往往有多条路径,其中,边的权值之和最小的路径称为最短路径,并称Vx为这条最短路径的源点,Vi为终点. 显然,边最少的路径不一定是最短路径. 求 ...
- 最短路径 - 迪杰斯特拉(Dijkstra)算法
对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...
- NYOJ有趣的问题(单源最短路径dijkstra)
思路:这题的难度主要是在建图上,建完图之后就是求单源最短路径问题.可用dijkstra算法.要注意他给出的墙的x坐标不是有序 的. #include<stdio.h> #include&l ...
- 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)
前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...
- 算法导论-上课笔记11:单源最短路径
文章目录 0 前言 0.1 最短路径的几个变体 0.2 最短路径的最优子结构 0.3 负权重的边 0.4 环路 0.5 最短路径的表示 0.6 松弛操作 0.7 最短路径和松弛操作的性质 1 Bell ...
- c语言单源最短路径问题实验报告,数据结构课程设计最短路径问题实验报告-20210320182652.docx-原创力文档...
IMB standardization office[IMB 5AB- IMBK 08- IMB 2C] IMB standardization office[IMB 5AB- IMBK 08- IM ...
最新文章
- 论如何寻找万一的川财证券开户渠道
- 如何快速分辨一个男人是不是程序员
- Windows与VMware下的Linux文件共享方式总结
- 【Java多线程】并发时的线程安全:快乐影院示例
- c++输入了后边不继续_医疗:连涨多日,后边还能加仓吗?直接说答案!
- 【 Grey Hack 】记一次被黑经历
- ffmpeg——vs集成ffmpeg相关开发
- 设计灵感|时尚潮流品牌如何通过网页设计呈现
- LeetCode 154. 寻找旋转排序数组中的最小值 II (二分)
- php ajax 搜索实例,PHP 实例 AJAX 实时搜索
- 解析新浪微博表情包的一套js代码
- springboot 连接并操作redis 完全可用的
- 欢迎使用CSDN-markdown编辑器大范甘迪
- 邓元鋆:AMD的方法论
- 视觉算法工程师百度百科,视觉算法工程师是什么
- 汇编语言L0C,单片机汇编语言指令查表.doc
- UML协作图(通信图)——软件需求分析与设计
- Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
- 瑞吉外卖之 redis优化缓存
- 服务器环境搭建(裸机到应用)