一、算法简介

​       迪杰斯特拉算法(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. Tungsten Fabric SDN — 网络架构
  2. 【以太坊】在测试网络上发布智能合约
  3. 利用Struts拦截器限制上传图片的格式和大小
  4. log4j监控mybatis的普通配置
  5. iOS 9.0以后支持http协议
  6. SQL条件语句(IF, CASE WHEN, IF NULL)
  7. android 6.0 数据库权限,Android超清晰6.0权限申请AndPermission
  8. 【蓝桥杯每日一练】 巴斯卡三角形(杨辉三角形)
  9. session过期返回登录页面跳出frame
  10. 在linux中安装adb和fastboot工具
  11. echarts地图放大拖拽
  12. 电路分析之正弦稳态电路的仿真与研究
  13. 使用hydra破解密码
  14. 我曾经在课间给学生讲过的金庸小说片段
  15. selenium中键盘操作
  16. Spring Boot 分布式事物管理
  17. node 多版本管理 nvm-window(适用win7 win10)
  18. 蚂蚁金服 CTO 新加坡演讲:小蚂蚁是如何“爬”上区块链的?
  19. RTCP Receiver Report(RR)相关
  20. 机器人瓦力有什么西方的风格_机器人瓦力中英文对照影评

热门文章

  1. 【网页设计自习室#010】CSS01
  2. 计数器matlab,matlab的stateflow(状态流)简单应用--做一个计数器
  3. 虹科案例|奔驰GLS车型座椅控制器模块测试
  4. 【历史上的今天】10 月 2 日:ENIAC 计算机退休;贝尔德发明电视;香港科技大学办学
  5. 我00后,会Python,月薪4000,兼职1.2w
  6. [android开发]来电拦截 ITelephony
  7. 愿医生护士们加强防护,平安健康
  8. 应届生论坛求职分享:最好的莫过于如愿以偿(阿里、去哪儿网、360、华为、中兴offer都到碗里来)
  9. [百度搜索框Bootstrap模仿]
  10. php网页制作中搜索框的代码,在网页里嵌入百度搜索框功能