算法分析与设计课程设计-Dijkstra最短路径算法
算法分析与设计课程设计报告书
题目:Dijkstra最短路径算法
设计人:张钦颖
班级:14计科2班 学号:1414080901218
一、 实验环境:
1、硬件环境:个人机,CPU主频:4.01Ghz 内存:16G
2、软件环境:操作系统:win10
编程语言:C++
二、 实验任务解决方案:
1、 Dijkstra最短路径算法的流程图。
(1) 创建一组sptSet(最短路径数组),它存的是已经在SPT里的节点,也就是这些是已经计算过的,确定的最小值,一开始这里是空的。
(2) 给所有的给定图中的节点一个指定的距离值。将所有的距离值初始化为无限,将源节点初始为0。
(3) 当另一个(保存未放入SPT的节点的那个)不为空时:
① 选择一个不在SPTset中一个离源点距离最小的节点
② 把它加入SPTset
③ 更新所有于这个节点临近的节点的距离值。为了更距离值,遍历这个点所有的相邻点。对于每一个相邻的节点,如果这临近点u的距离值(从源节点开始的和)比v(新 加入的)小,就把v的距离值更新
例如:
一开始SPTset是空的,并且它初始化的距离值是{0,无限,无限,无限,无限,无限,无限,无限}。现在选择最小距离值的顶点。我们选了节点0,将它加入到sptSet。所以sptSet变为{0}。加入0至sptSet后,更新其相邻顶点的距离值。0相邻的节点为1和6,他们的距离值便被更新成3和4。图中标示出在SPT的顶点显示为绿色。
然后我们选择一个不包含在SPT里一个路径值为最小的一个节点,节点1被选了而且被加入到了sptSET,所以sptSET现在变为了{0,1}更新1临近节点的距离值,临近节点为2跟8,节点2跟8的距离值便变成了3+6=9、3+16=19。
像上面一样选一个,我们选了节点6,加入到sptSet,所以sptSet变成了{0,1,6},更新节点6的临近节点的距离值,临近节点是5和7,更新后5:4+20=24,7:4+10=14
然后我们再选一个2加入,sptSet又新来了一个数字2,2的临近节点3和8便更新为11和26.
一直重复这些事儿直到sptset包含所有的节点:
最后,我们终于得到了一棵完整的最短路径树
2、Dijkstra最短路径算法实现的关键代码。
#include <stdio.h>
#include <limits.h>// Number of vertices in the graph
#define V 9// A utility function to find the vertex with minimum distance value,from
// the set of vertices not yet included in shortest path tree
int minDistance(int dist[], bool sptSet[])
{// Initialize min valueint min = INT_MAX,min_index;for (int v = 0; v < V;v++)if (sptSet[v] == false&& dist[v] < min)min = dist[v],min_index = v;return min_index;
}// A utility function to print the constructed distance array
void printSolution(int dist[], int n)
{printf("顶点\t\t距离源点的最短路径\n");for (int i = 0; i < V;i++)printf("%d\t\t%d\n", i, dist[i]);
}// Funtion that implements Dijkstra's single source shortest pathalgorithm
// for a graph represented using adjacency matrix representation
void dijkstra(int graph[V][V], int src)
{int dist[V]; // The output array. dist[i] will hold the shortest// distance from src to ibool sptSet[V]; // sptSet[i]will true if vertex i is included in shortest// path tree or shortestdistance from src to i is finalized// Initialize all distancesas INFINITE and stpSet[] as falsefor (int i = 0; i < V;i++)dist[i] = INT_MAX,sptSet[i] = false;// Distance of source vertexfrom itself is always 0dist[src] = 0;// Find shortest path forall verticesfor (int count = 0; count< V - 1; count++){// Pick the minimumdistance vertex from the set of vertices not// yet processed. u isalways equal to src in first iteration.int u =minDistance(dist, sptSet);// Mark the pickedvertex as processedsptSet[u] = true;// Update dist value ofthe adjacent vertices of the picked vertex.for (int v = 0; v < V; v++)// Update dist[v]only if distance to v is not in sptSet, there// is an edgefrom u to v, and total weight of path from src to// v through u issmaller than dist[v]if (!sptSet[v]&& graph[u][v] && dist[u] + graph[u][v] < dist[v])dist[v] = dist[u]+ graph[u][v];}// print the constructeddistance arrayprintSolution(dist, V);
}// driver program to test above function
int main()
{/* Let us create the examplegraph discussed above */int graph[V][V] = {{ 0, 3, 0, 0, 0, 0, 4,0, 0 },{ 3, 0, 6, 0, 0, 0, 0,0, 16 },{ 0, 6, 0, 2, 0, 0, 0,0, 17 },{ 0, 0, 2, 0, 4, 0, 0,0, 9 },{ 0, 0, 0, 4, 0, 11, 0,7, 0 },{ 0, 0, 0, 0, 11, 0,20, 0, 0 },{ 4, 0, 0, 0, 0, 20, 0,10, 0 },{ 0, 0, 0, 0, 7, 0, 10,0, 1 },{ 0, 16, 17, 9, 0, 0,0, 1, 0 }};dijkstra(graph, 0);return 0;
}
三、 Dijkstra最短路径算法的计算复杂度分析(最好、最差、平均情况复杂度):
(1) 最好的情况:每个顶点第一次检测到就是路径值就是最短路径。复杂度最低。
复杂度为:2n²+6n
(2) 最坏情况:顶点被检测了1次以上,并且每次检测都更新路径值为最小,即每次找的都不是最短路径,直到最后一次检测。复杂度最高
复杂度为:3n²+6n
(3) 平均情况复杂度:时间复杂度为O(n²)
四、 总结综合实验心得体会:
本次的Dijkstra最短路径算法在数据结构的课程上也接触过,所以感觉这个不成问题,选用的例子是自己随手画出来的,然后按照Dijkstra最短路径算法把流程步骤分别画了出来。然后其他部分参考了一下wiki以及geek论坛等国外大神的论文。还有很多东西老师在课堂上也给我们又讲了一遍,所以从算法思想上就不成多大问题了,主要是代码,而且必须得了解了算法才能mark得出代码来,否则根本无从下手。
算法分析与设计课程设计-Dijkstra最短路径算法相关推荐
- c 语言车牌识别系统课题设计,车牌识别系统的设计--课程设计报告.doc
车牌识别系统的设计--课程设计报告 目录 一.摘要:3 二.设计目的和意义:3 2.1.设计目的:3 2.2.设计意义:3 三.设计原理:3 四.详细设计步骤:3 4.1.提出总体设计方案:4 4.2 ...
- 机械设计说明书_如何做机械设计课程设计?这篇文章总结很详细
机械装置总体设计 今天和大家演示一遍机械设计课程设计的总体思路,老同学可以复习一下,新同学可以熟悉机械设计过程,掌握机械设计的一般方法和规律.机械装置如下图所示: 设计工作量和设计过程 1.设计工作量 ...
- aes算法c语言实现_C语言实现常用数据结构:Dijkstra最短路径算法(第18篇)
「今天是学习C语言第 161 天」 纸上学来终觉浅,绝知此事要躬行.-- 陆游「冬夜读书示子聿」#题外话算法学习重点是学习如何编程使用它. # Dijkstra算法 Dijkstra算法,中文译名迪杰 ...
- Dijkstra最短路径算法——java代码实现
具体的算法详解可以看这篇博客Dijkstra最短路径算法详解. 这里我利用.txt文件存储了有向加权图中顶点之间的连接关系以及边上的权重,文件格式如下: 代码所构造的有向加权图如下: package ...
- php网页课程设报告,网页设计课程设计报告
<网页设计课程设计报告>由会员分享,可在线阅读,更多相关<网页设计课程设计报告(10页珍藏版)>请在人人文库网上搜索. 1.网页设计课程设计报告系别: 计算机科学系 班级: 0 ...
- c语言六位抢答器课程设计,基于c语言单片机8位竞赛抢答器设计课程设计.docx
基于c语言单片机8位竞赛抢答器设计课程设计 课程设计报告课程名称:单片机课程设计报告题目:8位竞赛抢答器的设计学生姓名:所在学院:信息科学与工程学院专业班级:学生学号:指导教师:2013 年12月25 ...
- 中国石油大学《机械设计课程设计》在线考试
中国石油大学(北京)远程教育学院 期 末 考 试 <机械设计课程设计> 学习中心:__ 姓名:_ 学号:___ 关于课程考试违规作弊的说明 1.提交文件中涉嫌抄袭内容(包括抄袭网 ...
- 用于《机械设计课程设计》中的减速箱设计的Python计算程序
Requirement Python 3+ 1. Overview 几乎所有高校的机械类专业都有<机械设计课程设计>课程,课程内容几乎都是设计一个减速箱.可能是一级减速,二级减速等,可能是 ...
- C语言单相智能电表课程设计,《单相单用户电能表的设计课程设计》
<<单相单用户电能表的设计课程设计>>由会员分享,可在线阅读,更多相关<<单相单用户电能表的设计课程设计>(10页珍藏版)>请在金锄头文库上搜索. 1. ...
最新文章
- AWR baseline template的管理
- Cpp / std::move 原理
- NEC SV8100电话交换机配置梓博电话计费系统
- js基础---数组方法
- POJ 3461 字符串匹配(KMP / 哈希(有推导))
- 怎样呵护友谊_呵护真正的友情,助力漫长的人生
- HTML5新特征、窍门和技术(11~15)
- 【优化算法】差分蜂群优化算法(DEABC)【含Matlab源码 1423期】
- 方正伪GBK(字体名称中有GBK且字数不足21003)字体列表及使用注意事项
- C# 使用 itextsharp
- 像程序员一样思考——解决问题
- cmos电路多余输入端能否悬空_CMOS电路多余输入端悬空会造成逻辑混乱,可以这样处理!...
- 梁宁产品思维 一张图
- UV-a1586-分子式
- DMA驱动框架流程编写
- Linux 桌面玩家指南:03. 针对 Gnome 3 的 Linux 桌面进行美化
- 特么,冒泡排序有这么难?
- InnoSetup打包自动签名
- android pdf编辑,PDF Reader Pro 功能强大的 PDF 阅读编辑器
- 2013年9月19日