单源最短路径算法—Dijkstra算法(详细介绍)
一、算法简介
迪杰斯特拉算法(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算法(详细介绍)相关推荐
- 图的单源最短路径:Dijkstra算法实现
本文介绍的是图的非负权值的单源最短路径问题.问题的提出是,对于有权图D,t提供源点v,要找到从v到其他所有点的最短路径,即单源最短路径问题,在本文中,解决这一问题,是普遍比较熟悉的Dijkstra算法 ...
- dijkstra算法PHP,单源最短路径(dijkstra算法)php实现
做一个医学项目,其中在病例评分时会用到单源最短路径的算法.单源最短路径的dijkstra算法的思路如下: 如果存在一条从i到j的最短路径(Vi.....Vk,Vj),Vk是Vj前面的一顶点.那么(Vi ...
- C语言基本数据结构之三(图的广度及深度遍历,求单源最短路径的Dijkstra算法)
上一篇主要讲了二叉树的先序,中序,后序遍历算法以及深度和节点的算法,这篇就讲一讲图的基本算法. 一.图的基本概念 1.1有向图G1: 有向图G是由两个集合V(G)和E(G)组成的,其中:V(G)是顶点 ...
- 图的单源最短路径(Dijkstra算法)
单源最短路径问题 如果从图中某一顶点(源点)到达另一顶点(终点)的路径可能不止一条,如何找到一条路径使得沿此路径各边上的权值总和达到最小. Dijkstra算法由来 迪杰斯特拉算法(Dijkstra) ...
- c语言单源最短路径问题实验报告,单源最短路径问题Dijkstra算法的c语言实现
求单源最短路径是图论中比较基本的问题,通常的Dijkstra算法是按阶段进行的,每个节点标有处理和未处理状态的标记,设立一个数组,每个数组中第i个元素为源节点到第i个节点的最短路径(当然,该数组的初值 ...
- 【算法设计与分析】 单源最短路径(贪心算法) Dijkstra
[算法设计与分析] 单源最短路径(贪心算法) Dijkstra [问题描述] Dijkstra算法解决的是带权重的有向图上单源最短路径问题.所有边的权重都为非负值.设置顶点集合S并不断地作贪心选择来扩 ...
- 最短路径:Dijkstra算法(求单源最短路径)Floyd算法(求各顶点之间最短路径)
最短路径: 在一个带权图中,顶点V0到图中任意一个顶点Vi的一条路径所经过边上的权值之和,定义为该路径的带权路径长度,把带权路径最短的那条路径称为最短路径. DiskStra算法: 求单源最短路径,即 ...
- 单源最短路——dijkstra算法
Dijkstra算法 1.定义概览 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 问 ...
- matlab结束外循环,求单源最短路径的BellmanFord算法的matlab实现及其优化
function [minD,path] = BellmanFord(w,start,terminal) %求单源最短路径的Bellman-Ford算法(图论) %调用格式:[minD,path] = ...
- JAVA编程求单源最短路径_【算法】单源最短路径——dijkstra算法
一,概念 单源最短路径 给定一个带权有向图G=(V,E),其中每条边的权是一个实数.另外,还给定V中的一个顶点,称为源.要计算从源到其他所有各顶点的最短路径长度.这里的长度就是指路上各边权之和.这个问 ...
最新文章
- Tungsten Fabric SDN — 网络架构
- 【以太坊】在测试网络上发布智能合约
- 利用Struts拦截器限制上传图片的格式和大小
- log4j监控mybatis的普通配置
- iOS 9.0以后支持http协议
- SQL条件语句(IF, CASE WHEN, IF NULL)
- android 6.0 数据库权限,Android超清晰6.0权限申请AndPermission
- 【蓝桥杯每日一练】 巴斯卡三角形(杨辉三角形)
- session过期返回登录页面跳出frame
- 在linux中安装adb和fastboot工具
- echarts地图放大拖拽
- 电路分析之正弦稳态电路的仿真与研究
- 使用hydra破解密码
- 我曾经在课间给学生讲过的金庸小说片段
- selenium中键盘操作
- Spring Boot 分布式事物管理
- node 多版本管理 nvm-window(适用win7 win10)
- 蚂蚁金服 CTO 新加坡演讲:小蚂蚁是如何“爬”上区块链的?
- RTCP Receiver Report(RR)相关
- 机器人瓦力有什么西方的风格_机器人瓦力中英文对照影评
热门文章
- 【网页设计自习室#010】CSS01
- 计数器matlab,matlab的stateflow(状态流)简单应用--做一个计数器
- 虹科案例|奔驰GLS车型座椅控制器模块测试
- 【历史上的今天】10 月 2 日:ENIAC 计算机退休;贝尔德发明电视;香港科技大学办学
- 我00后,会Python,月薪4000,兼职1.2w
- [android开发]来电拦截 ITelephony
- 愿医生护士们加强防护,平安健康
- 应届生论坛求职分享:最好的莫过于如愿以偿(阿里、去哪儿网、360、华为、中兴offer都到碗里来)
- [百度搜索框Bootstrap模仿]
- php网页制作中搜索框的代码,在网页里嵌入百度搜索框功能