14天阅读挑战赛

目录

1.问题描述

2.问题分析

3.算法设计

4.C++程序

5.算法分析


1.问题描述

对于有向带权图G=(V,E),其中每条边的权值都是非负实数。给定V中的一个节点(称为源点),计算源点到其他各节点之间的最短路径,即单源最短路径。

2.问题分析

Dijkstra算法是解决单源最短路径问题的贪心算法。Dijkstra算法基本思路是先求出源点当前节点最短的一条路径,然后根据当前最短路径末端点能够到达的点求出下一条离源点最近的路径,直到求出源点到其他各节点的最短路径。

3.算法设计

将节点集合V划分为两部分——集合S和V-S(节点总的集合减去已经确定最短路径的点的集合)。其中,集合S中的节点到源点的最短路径已经确定,集合S中的节点到源点的最短路径已经确定,集合V-S中节点的路径称为特殊路径,数组dist[]用于记录从源点到每个节点的最短特殊路径的长度。Dijkstra算法的贪心策略是选择最短的特殊路径长度dist[t],将节点t添加到集合S中,同时借助节点t更新dist[]。一旦集合S包含了所有的节点,dist[]就是从源点到其他节点的最短路径长度。

具体步骤如下:

1)确定合适的数据结构。用邻接矩阵(二维数组G[][])存储图,用一维数组dist[i]记录从源点到节点i的最短路径长度,用一维数组p[i]记录最短路径上节点的直接前驱,例如p[2]=3,则2的前一个节点为3;

2)初始化。假设节点u为源点,令集合S={u},对于集合V-S中的节点i,初始化dist[i]=G[u][i]。入股从源点u到节点有边相连,就初始化p[i]=u,否则初始化p[i]=-1;

3)找最小。根据贪心策略查找集合V-S中dist[]最小的节点t,t就是集合V-S中距离源点u最近的节点,将节点t添加到集合S中;

4)执行松弛操作。对于集合V-S中的所有节点j,检查是否可以借助节点t得到更短的路径。如果源点u经节点t到节点j的路径更短(即:dist[j]>dist[t]+G[t][j]),则更新dist[j]=dist[t]+G[t][j](即执行松弛操作)并记录j的直接前驱为t(即p[j]=t)。

5)重复步骤3和4,直到集合V-S为空。由此可以得到源点u到其他各节点的最短路径长度,此位还可以通过前驱数组p[]逆向找到最短路径上经过的点。

4.C++程序

//program 2.5.0 dijkstra算法
#include<iostream>
#include<algorithm>
#include<stack>
using namespace std;
const int N = 1005;
const int INF = 0x3f3f3f3f; //无穷大
int G[N][N], dist[N]; //G[][]为邻接矩阵,dist[i]表示源点到结点i的最短路径长度
int p[N]; //p[i]表示源点到结点i的最短路径上i的前驱
int n, m; //n为结点数,m为边数
bool flag[N]; //如果flag[i]等于true,说明结点i已经加入到S集合;否则i属于V-S集合void dijkstra(int u) {for (int i = 1; i <= n; i++) { //初始化dist[i] = G[u][i]; //初始化源点u到其他各个结点的最短路径长度flag[i] = false;if (dist[i] == INF)p[i] = -1; //源点u到该结点的路径长度为无穷大,说明源点u与结点i不相邻elsep[i] = u; //说明结点i与源点u相邻,设置i的前驱为u}dist[u] = 0;flag[u] = true; //初始时,集合S中只有源点ufor (int i = 1; i < n; i++) {int temp = INF, t = u;for (int j = 1; j <= n; j++) { //在集合V-S中寻找距离源点u最近的结点tif (!flag[j] && dist[j] < temp) {t = j;temp = dist[j];}  }if (t == u) return; //找不到t,跳出循环flag[t] = true;  //否则,将t加入S集合for (int j = 1; j <= n; j++) { //更新t的邻接点j的最短路径长度,松弛操作 if (!flag[j] && dist[j] > dist[t] + G[t][j]) {dist[j] = dist[t] + G[t][j];p[j] = t;}}}
}void findpath(int u){//输出源点到其它各结点的路径 int x;stack<int>s;cout<<"源点为:"<<u<<endl;for(int i=1;i<=n;i++){x=p[i];while(x!=-1){s.push(x);x=p[x];}cout<<"源点到其它各结点最短路径为:";while(!s.empty()){cout<<s.top()<<"--";s.pop();}cout<<i<<";最短距离为:"<<dist[i]<<endl;}
}int main() {int u, v, w, st;//u、v表示结点,w表示u--v的距离,st表示源点int t;//测试用例数 cin >> t;while (t--) {cin >> n >> m; //n为节点个数,m为两点直接有相连权值的个数for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)G[i][j] = INF;//初始化邻接矩阵为无穷大while (m--) {cin >> u >> v >> w;G[u][v] = min(G[u][v], w); //邻接矩阵储存,保留最小的距离}cin >> st;//输入源点 dijkstra(st);for (int i = 1; i <= n; i++) {//输出源点到各结点的最短路径长度,即dist[]数组 if (i != 1) cout << " ";if (dist[i] == INF)cout << "impossible";elsecout << dist[i];}cout << endl;findpath(st);}system("pause");return 0;
}

5.算法分析

1)算法复杂度:找最小以及松弛操作本身执行了n次,需要重复n-1,总的执行次数均为次,时间复杂度为O()。

2)空间复杂度:辅助数组flag[]、p[]以及变量i、j、t、temp等,空间复杂度为O(n)。

贪心算法——Dijkstra最短路径相关推荐

  1. 贪心算法——Dijkstra

    算法用途 找出加权图中前往X的最短路径 并不单指距离,只要能转换成有向图并且边存在权重的情况都适用,当然边的权重不能存在负值 算法思想 找最小花销的节点 更新该节点邻居的最小花销 重复上述过程直到遍历 ...

  2. python贪心算法最短路径_贪心算法之最短路径

    1.Dijkstra算法 Dijkstra算法(单源最短路径) 单源最短路径问题,即在图中求出给定顶点到其它任一顶点的最短路径.在弄清楚如何求算单源最短路径问题之前,必须弄清楚最短路径的最优子结构性质 ...

  3. 贪心算法之最短路径问题(Dijkstra算法)

    1.问题 一个求单源最短路径的问题.给定有向带权图 G =(V, E ), 其中每条边的权是非负实数.此外,给定 V 中的一个顶点, 称为源点.现在要计算从源到所有其他各顶点的最短路径长 度,这里路径 ...

  4. 贪心算法之用优先队列解决最短路径问题(Dijkstra算法)

    1.问题 最短路径问题(Dijkstra算法)用 优先队列实现,问题描述和分析和优先队列先看前面我的几篇博客 贪心算法之最短路径问题(Dijkstra算法) C++之STL之priority_queu ...

  5. c语言迪杰斯特拉算法求最短路径,迪杰斯特拉 ( Dijkstra ) 最短路径算法

    迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径.它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本 ...

  6. 贪心算法单源点最短路径例题c语言源代码,Dijkstra算法是解单源最短路径问题的一个贪心算法...

    问题描述 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数. 另外,还给定 V 中的一个项点,称为源. 现在我们要计算从源到所有其他各项点的最短路径长度. 这里的长度是指路上各边权之 ...

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

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

  8. 常用十大算法 非递归二分查找、分治法、动态规划、贪心算法、回溯算法(骑士周游为例)、KMP、最小生成树算法:Prim、Kruskal、最短路径算法:Dijkstra、Floyd。

    十大算法 学完数据结构该学什么?当然是来巩固算法,下面介绍了十中比较常用的算法,希望能帮到大家. 包括:非递归二分查找.分治法.动态规划.贪心算法.回溯算法(骑士周游为例).KMP.最小生成树算法:P ...

  9. Dijkstra 贪心算法 动态规划

    我认为 Dijkstra算法 的本质是 广度优先搜索, 而此处的广度是定义在路程的cost之上的. (就好比从圆心处向外扩散一个圆环,首次碰到的就是最近) 动态规划泛指,重叠子问题与原问题的推算关系( ...

最新文章

  1. JS数字金额转为大写金额
  2. Java 注解 --很有趣的一篇文章
  3. 使用UIScrollView 实现分页功能
  4. x = x (x-1)
  5. [云炬python3玩转机器学习笔记] 2-6关于回归和分类
  6. font-size:100%理解
  7. 【chorme插件开发】第三节:开发html的展示类型插件实例
  8. 浅谈java中的接口
  9. 服务评价器连接计算机后无法启动,win10专业版远程桌面Remote Desktop Connection已停止工作?...
  10. 投简历 找工作 App
  11. 爱快软路由上装linux,爱快软路由系统利用自带虚拟机安装系统
  12. Wi-Fi:802.11ac new feature Beamforming
  13. 英语语法---读音规则
  14. FOC控制中电流环带宽
  15. js中的json和ascii转换
  16. 初始化mysql5.7.18_MySQL5.7.18,初始化完成登录,提示密码过
  17. 名帖109 鲜于枢 小楷《老子道德经卷》
  18. 电脑硬件升级——笔记本更换更大容量的固态硬盘,并进行系统迁移
  19. TIA博途中如何设计报警功能块FB,来简化编写离散量报警程序的时间?
  20. 扫二维码 下载app

热门文章

  1. 俄罗斯通信和大众传媒部起草ICO相关法案
  2. 视频教程-2020软考软件设计师-上午真题解析视频课程-软考
  3. 嗯嗯,你只是不懂罢了
  4. uni-app发布android版App的详细过程
  5. 财报解读:上市九年亏77亿元,2023年的途牛“等风来”
  6. vscode快捷键使用
  7. 【教学类-12-06】20221108《连连看竖版6*6(3套题目符号图案,适合小班)》(小班主题《娃娃家》)
  8. HDR多帧曝光融合Python代码实现
  9. part1 selenium爬取BOSS直聘信息
  10. 做空机构12次围攻下,跟谁学逆势续写高增长神话