Dijkstra理解与编程(一)
来源:互联网 发布:西安软件开发平均工资 编辑:程序博客网 时间:2024/06/07 21:44
本文以最简洁的方式描述Dijkstra算法,如下图所示:
上图数据保存于如下二维数组G(Graph)中:
int G[5][5] = { {0, 9, 1, INF, 3 }, {9, 0, 5, INF, INF }, {1, 5, 0, 7, 4 }, {INF, INF, 7, 0, 6 }, {3, INF, 4, 6, 0 } };
存储五个顶点中每个顶点与其他顶点对应的边长(未连接用INF表示,自身的边长为0)。过程主要分为如下三部分:
一、初始化;
while (节点没有标记完)
{
二、找最小距离节点,标记访问过;
三、更新dist数组;
}
说明:
一、初始化:
1. 初始化visit数组。记录某个节点是否已经访问过。
2. 初始化dist数组。dist(distance)数组就是源节点到另外各个节点的最短路径数组,也就是我们要得到的结果数组,如果是A节点为源节点,那么初始化将G中第一行距离值复制到dist数组中即可;
二、找最小距离节点,标记访问过:
从dist数组中找到数值最小的一个节点,记录数值min和索引minIndex。
三、 更新dist数组:
从图中看出,初始化A到D的距离是INF的,那么以B为中间点的话,A到D的dist[3]值就从INF更新为8了。
手动执行过程:
测试代码如下:
#include <iostream>using namespace std;const int LEN = 5;const int INF = 65535;void dijkstra(int G[5][5], int src, int* dist){ bool visit[LEN] = { false }; visit[src] = true; int min, minIndex; for (int i = 0; i < LEN; ++i) dist[i] = G[src][i]; for (int i = 0; i < LEN; ++i) { min = INF; for (int j = 0; j < LEN; ++j) { if (!visit[j] && dist[j] < min) { min = dist[j]; minIndex = j; } } visit[minIndex] = true; for (int j = 1; j < LEN; ++j) { if (!visit[j] && G[minIndex][j] + min < dist[j]) dist[j] = G[minIndex][j] + min; } }}int main(){ int G[5][5] = { {0, 9, 1, INF, 3 }, {9, 0, 5, INF, INF }, {1, 5, 0, 7, 4 }, {INF, INF, 7, 0, 6 }, {3, INF, 4, 6, 0 } }; int dist[5]; dijkstra(G, 0, dist); for (int i = 0; i < 5; ++i) cout << dist[i] << " "; return 0;}
结果:0 6 1 8 3
和手动观察计算结果一致。
阅读全文
0 0
- Dijkstra理解与编程(一)
- Linux进程理解与实践(一)基本概念和编程概述(fork,vfork,cow)
- Linux进程理解与实践(一)基本概念和编程概述(fork,vfork,cow)
- 深入理解Android网络编程(一)
- 深入理解JS异步编程(一)
- 理解Flink(一):数据流编程模型
- 最短路 - dijkstra - (一)
- (最短路)dijkstra算法理解
- 深入理解矩阵与渲染(一)
- spring的理解与学习(一)
- Dijkstra算法求单源最短路径(一)
- 最短路专题一(dijkstra)
- 《编程范式与编程语言》笔记与摘要(一)
- 理解继承(一):JS面向对象编程(封装)
- 对极限编程四个核心的理解(一)
- 深入理解并行编程-分割和同步设计(一)
- 理解面向对象编程(一)-类和对象
- 深入理解C#:编程技巧总结(一)
- ReentrantLock的四种加锁方式
- Leetcode刷题 690 Employee Importance
- 状态响应码汇总
- Unity3d 简单的消息系统
- 画出特定的图形
- Dijkstra理解与编程(一)
- 电话簿维护程序
- 论文笔记:Hashtag Recommendation for Multimodal Microblog Using Co-Attention Network
- WebView基础二:常用方法和常用类
- Java ArrayList工作原理及实现
- 排序算法-n^2级别
- 关于表单中文件的上传
- 第三次java作业
- StringBuffer与StringBuilder与String的不同