一、算法简介

​       迪杰斯特拉算法(Dijkstra),由荷兰计算机科学家艾兹赫尔·戴克斯特拉在1956年提出。又叫狄克斯特拉算法。这是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法的策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。

二、算法原理

Dijkstra算法算是贪心思想实现的,首先把起点到所有点的距离存下来找个最短的,然后标记这个点,在没有标记的点中找到最短的,将这个点的前驱节点记录下来,重复这个步骤,直至标记所有点。

三、原理讲解

【算法】最短路径查找—Dijkstra算法_哔哩哔哩_bilibili

这位up主讲的非常清晰。

四、 实现步骤

1.每次从未标记的节点中选择距离出发点最近的节点,标记,收录到最优路径集合中。

2.计算刚加入节点A的邻近节点B的距离(不包含标记的节点),若(节点A的距离+节点A到节点B的边长)<节点B的距离,就更新节点B的距离和前面点。

五、 算法实现

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>#define SIZE 20 // 定义数组的长度
#define MAX 999 // 假设距离为无穷远struct mark {   // 用来记录每个点的状态int value;int pre_index;int Flag;
};// 递归实现记录表
void create_list(int arr[SIZE][SIZE], struct mark list[SIZE], int n) {int min = MAX;int index = 0;int count = 0;// 找出路径最短的点for (int i = 0; i < n; i++) {if (list[i].Flag != 1) {if (min > list[i].value) {min = list[i].value;index = i;}count++;}}if (count == 0) {return;}// 将这个点标记list[index].Flag = 1;// 比较权值并赋值for (int j = 0; j < n; j++) {if (arr[index][j] < MAX) {if (list[j].value > (arr[index][j] + list[index].value)) {list[j].value = arr[index][j] + list[index].value;list[j].pre_index = index;}}}// 打印求解过程for (int i = 0; i < n; i++) {printf("%d: value: %d, pro: %d,  b: %d\n", i, list[i].value, list[i].pre_index, list[i].Flag);}printf("\n");create_list(arr, list, n);
}// 打印起点到各个点的最短路径和路径权值之和
void print(struct mark list[SIZE], int n) {int value = list[n].value;int index = n;for (;;) {printf("%d - ", index);index = list[index].pre_index;if (index == -1) {break;}}printf("\n");printf("value: %d\n", value);
}int dijkstra(int arr[SIZE][SIZE], struct mark list[SIZE], int n) {// 初始化记录表for (int i = 0; i < n; i++) {list[i].Flag = 0;list[i].value = MAX;list[i].pre_index = -1;}int start = 0;printf("请输入起点:");scanf("%d", &start);list[start].value = 0;// 实现记录表create_list(arr, list, n);return 0;
}int main() {int n = 0;int x = 0;int y = 0;int v = 0; int bian = 0;printf("请输入点的个数: ");scanf("%d", &n);printf("请输入边的条数: ");scanf("%d", &bian);int arr[SIZE][SIZE] = { MAX };for (int i = 0; i < n; i++) {for (int j = 0; j < n; j++) {arr[i][j] = MAX;}}while (bian){printf("请输入边的 端点 和 权值:\n");printf("端点 (从0开始) : ");scanf("%d", &x);scanf("%d", &y);if (x > n || y > n || x < 0 || y < 0) {system("cls");printf("输入错误,请重新输入!!!\n");continue;}printf("权值: ");scanf("%d", &v);// 初始化图arr[y][x] = v;arr[x][y] = v;bian--;}// 创建记录表struct mark list[SIZE];// 调用算法dijkstra(arr, list,n);// 打印计算结果int index = -1;int count = 0;for (int i = 0; i < n; i++) {print(list,i);printf("\n");}return 0;
}

六、 算法测试

单源最短路径算法—Dijkstra算法(详细介绍)相关推荐

  1. 图的单源最短路径:Dijkstra算法实现

    本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...

  2. dijkstra算法PHP,单源最短路径(dijkstra算法)php实现

    做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...

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

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

  4. 图的单源最短路径(Dijkstra算法)

    单源最短路径问题 如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径各边上的权值总和达到最小. Dijkstra算法由来 迪杰斯特拉算法(Dijkstra) ...

  5. c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现

    求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...

  6. 【算法设计与分析】 单源最短路径(贪心算法) Dijkstra

    [算法设计与分析] 单源最短路径(贪心算法) Dijkstra [问题描述] Dijkstra算法解决的是带权重的有向图上单源最短路径问题.所有边的权重都为非负值.设置顶点集合S并不断地作贪心选择来扩 ...

  7. 最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)

    最短路径: 在一个带权图中,顶点V0到图中任意一个顶点Vi的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径最短的那条路径称为最短路径. DiskStra算法: 求单源最短路径,即 ...

  8. 单源最短路——dijkstra算法

    Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...

  9. matlab结束外循环,求单源最短路径的BellmanFord算法的matlab实现及其优化

    function [minD,path] = BellmanFord(w,start,terminal) %求单源最短路径的Bellman-Ford算法(图论) %调用格式:[minD,path] = ...

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

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

最新文章

  1. 学python有什么好处 学完可以做什么
  2. 资源下载 | 历年 AAAI 最佳论文(since 1996)
  3. M元上升子序列【树状数组+dp】
  4. VTK:PolyData之TriangleArea
  5. 小白也能看懂——使用dev-c++建立工程(多个文件一同编译连接)并运行
  6. VirtualBox linux 网络设置 Bridged Adapter模式
  7. 类型转换和页面获取值(总爱忘的)
  8. python讲得比较好的视频_有没有推荐好的python教学视频?
  9. 苹果手机如何查看已经连接过的WIFI密码?
  10. Domain Driven Design 领域驱动设计
  11. 通知的各种实用写法技巧
  12. Ps素描效果引用说明
  13. 网管员必知:常用电脑密码破解
  14. 字符串生成条码(CODE128),并实现在水晶报表上的条码打印!
  15. VMware Horizon Client 远程控制桌面无法输入中文
  16. 计算方法 差商与牛顿插值
  17. Android调用相机预览黑屏app passed NULL surface解决
  18. DataFrame创建数据
  19. 怎么开发联机小游戏_Q飞机游戏:空战吃鸡大乱斗游戏!好玩的联机Q飞机对战小游戏...
  20. xshell连接不上linux(centos)

热门文章

  1. 本特利330130-040-01-00延伸电缆
  2. NLP常用库安装(一)genism,nltk
  3. 处理高并发、大数据存储的网站技术架构
  4. iOS多线程——Operation(自定义并发与非并发Operation)(Swift版)
  5. 大病不出县,移动云助力彰武县打造“县域医共体”示范点
  6. 神仙级别的 STL 数据结构:rope
  7. 数据库开发是干什么的?数据库开发难不难
  8. UWB高精度定位系统源码,商业级智慧工厂人员定位系统源码
  9. 专访阿里巴巴魏虎:揭秘阿里双11背后的全站个性化商铺千人千面
  10. 判断一个年份是否为闰年