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)算法相关推荐

  1. 最短路径之迪克斯特拉(Dijkstra)算法

    何谓最短路径 顾名思义就是在一个图中,一个顶点到另外一个顶点的最短距离拉.那么这里有一点要注意,就是在网图中(边的权值各不相同)最短路径指的是俩点之间的连线权值最小:在非网图(边的权值都默认为1)中最 ...

  2. c++ 单源最短路径-狄杰斯特拉算法

    文章目录 源码 输出 狄杰斯特拉算法 适用范围:没有负权重的图, 可以有环,有向无向图均可 求解问题:单源最短路径 时间复杂度:V^2 源码 #include <iostream> #in ...

  3. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

  4. 单源最短路径-迪杰斯拉特算法

    思路: 在网络中,从某个顶点Vx出发到达另外一个顶点Vi,往往有多条路径,其中,边的权值之和最小的路径称为最短路径,并称Vx为这条最短路径的源点,Vi为终点. 显然,边最少的路径不一定是最短路径. 求 ...

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

    对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd ...

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

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

  7. 图论-单源最短路径算法(拓扑,Dijkstra,Floyd,SPFA)

    前言 单源最短路径是学习图论算法的入门级台阶,但刚开始看的时候就蒙了,什么有环没环,有负权没负权,下面就来总结一下求单源最短路径的所有算法以及其适用的情况. 单源最短路径 设定图中一个点为源点,求其他 ...

  8. 算法导论-上课笔记11:单源最短路径

    文章目录 0 前言 0.1 最短路径的几个变体 0.2 最短路径的最优子结构 0.3 负权重的边 0.4 环路 0.5 最短路径的表示 0.6 松弛操作 0.7 最短路径和松弛操作的性质 1 Bell ...

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

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

最新文章

  1. 论如何寻找万一的川财证券开户渠道
  2. 如何快速分辨一个男人是不是程序员
  3. Windows与VMware下的Linux文件共享方式总结
  4. 【Java多线程】并发时的线程安全:快乐影院示例
  5. c++输入了后边不继续_医疗:连涨多日,后边还能加仓吗?直接说答案!
  6. 【 Grey Hack 】记一次被黑经历
  7. ffmpeg——vs集成ffmpeg相关开发
  8. 设计灵感|时尚潮流品牌如何通过网页设计呈现
  9. LeetCode 154. 寻找旋转排序数组中的最小值 II (二分)
  10. php ajax 搜索实例,PHP 实例 AJAX 实时搜索
  11. 解析新浪微博表情包的一套js代码
  12. springboot 连接并操作redis 完全可用的
  13. 欢迎使用CSDN-markdown编辑器大范甘迪
  14. 邓元鋆:AMD的方法论
  15. 视觉算法工程师百度百科,视觉算法工程师是什么
  16. 汇编语言L0C,单片机汇编语言指令查表.doc
  17. UML协作图(通信图)——软件需求分析与设计
  18. Intellij IDEA使用(十四)—— 在IDEA中创建包(package)的问题
  19. 瑞吉外卖之 redis优化缓存
  20. 服务器环境搭建(裸机到应用)

热门文章

  1. Win10Chrome调试安卓Chrome
  2. 软件 黑苹果盒盖不休眠_怎么解决苹果电脑合盖自动休眠问题?
  3. 用echartsjs 实现动态绘制折线、柱状等图形,并实现多图联动效果
  4. 类似360的轨迹加密功能
  5. ListView点击事件失效
  6. 数学公式是如何实现的?
  7. 嵌入式基础01【转载】详解大端模式和小端模式
  8. 面试官问的最后一个问题应该怎么回答?
  9. 计算机系统盘涨满怎么办,C盘莫名其妙满了 ,教你5种方法解决!
  10. 服务器网络协议是什么,介绍网络协议,什么是网络协议三要素?