【天梯赛】L2-001紧急救援(用迪杰斯特拉找出权重和最小的最短路径)

devtools/2025/2/13 13:03:45/

 解题反思

尝试DFS:开始使用DFS来遍历求解,但 DFS 存在大量重复计算,像同一节点会被多次访问并重复计算路径信息,导致时间复杂度高,部分测试点未通过

改用迪杰斯特拉:为了求解,设置了很多的辅助数组,对于他们本身的初始化、以及对于起始点S的初始化赋值容易出错,需要小心

迪杰斯特拉相当于是用一次过程找出了所有点的信息,最后只需要按要求输出D对应的信息即可

迪杰斯特拉算法,通过储存每个点的信息,为后续的其他点的信息求取打下了坚实基础,用空间换取了大量时间

题面

L2-001 紧急救援 - 团体程序设计天梯赛-练习集

代码实现 

// 定义常量 mx 为整型的最大值,用于表示无穷大
#define mx INT_MAX
#include<bits/stdc++.h>
using namespace std;int main()
{// N 表示城市数量,M 表示道路数量,S 表示起点城市,D 表示终点城市int N,M,S,D;// 从标准输入读取 N、M、S、D 的值cin>>N>>M>>S>>D;// 创建一个大小为 N 的向量 rescue,用于存储每个城市的救援人员数量vector<int>rescue(N);// 循环 N 次,依次读取每个城市的救援人员数量并存入 rescue 向量for(int i=0; i<N; i++) cin>>rescue[i];// 创建一个 N * N 的二维向量 graph,初始值都为 mx(无穷大),用于表示城市间的距离vector<vector<int>>graph(N, vector<int>(N, mx));// 循环 M 次,读取每条道路的信息for(int i=0; i<M; i++){// a 和 b 表示道路连接的两个城市,len 表示道路的长度int a, b, len;// 从标准输入读取 a、b、len 的值cin>>a>>b>>len;// 无向图,两个城市间的距离是对称的,更新 graph 矩阵graph[a][b] = len;graph[b][a] = len;}//// 存储从起点到每个城市的最短距离,初始值为 mx(无穷大)vector<int>dist_(N, mx);// 存储从起点到每个城市能召集到的最大救援人员数量,初始值为 0vector<int>re_rescue(N, 0);// 存储从起点到每个城市的最短路径数量,初始值为 0vector<int>path_cnt(N, 0);// 标记每个城市是否已经确定最短路径,初始值为 falsevector<bool>visited(N, false);// 存储每个城市在最短路径中的前驱城市,初始值为 -1vector<int>pre(N, -1);//// 起点到自身的距离为 0dist_[S] = 0;// 起点的前驱城市是自身pre[S] = S;// 起点到自身的最短路径数量为 1path_cnt[S] = 1;// 起点能召集到的救援人员数量就是起点城市本身的救援人员数量re_rescue[S] = rescue[S];// 迪杰斯特拉算法核心循环,循环 N 次for(int i=0; i<N; i++){// 用于记录当前未确定最短路径的城市中距离起点最近的城市编号,初始值为 -1int u = -1;// 记录当前找到的最小距离,初始值为 mx(无穷大)int min_len = mx;// 遍历所有城市for(int j=0; j<N; j++){// 如果该城市未确定最短路径且距离起点的距离小于当前最小距离if(!visited[j] && dist_[j] < min_len){// 更新最小距离min_len = dist_[j];// 更新最近城市编号u = j;}}// 如果没有找到符合条件的城市,说明所有可达城市都已确定最短路径,退出循环if(u == -1) break;// 标记该城市已确定最短路径visited[u] = true;// 遍历所有城市,更新与 u 相邻城市的信息for(int j=0; j<N; j++){// 如果 u 到 j 有道路且通过 u 到 j 的距离比当前记录的距离更短if(graph[u][j] != mx && dist_[j] > dist_[u] + graph[u][j]){// 更新 j 到起点的最短距离dist_[j] = dist_[u] + graph[u][j];// 更新 j 的前驱城市为 upre[j] = u;// 更新 j 的最短路径数量为 u 的最短路径数量path_cnt[j] = path_cnt[u];// 更新 j 能召集到的最大救援人员数量re_rescue[j] = re_rescue[u] + rescue[j];}// 如果 u 到 j 有道路且通过 u 到 j 的距离与当前记录的距离相等else if(graph[u][j] != mx && dist_[j] == dist_[u] + graph[u][j]){// 累加 j 的最短路径数量path_cnt[j] += path_cnt[u];// 如果通过 u 到 j 能召集到更多的救援人员if(re_rescue[j] < re_rescue[u] + rescue[j])//比较救援人数大小{// 更新 j 的前驱城市为 upre[j] = u;// 更新 j 能召集到的最大救援人员数量re_rescue[j] = re_rescue[u] + rescue[j];}}}}// 输出从起点到终点的最短路径数量和能召集到的最大救援人员数量cout<<path_cnt[D]<<" "<<re_rescue[D]<<endl;// 回溯找路径// 创建一个栈 help 用于存储路径stack<int>help;// 从终点开始回溯int cur = D;// 将终点压入栈中help.push(cur);// 当当前城市的前驱城市不是自身时,继续回溯while(pre[cur] != cur){// 更新当前城市为其前驱城市cur = pre[cur];// 将当前城市压入栈中help.push(cur);        }// 依次弹出栈中的元素并输出路径while(!help.empty()){// 获取栈顶元素cur = help.top();// 弹出栈顶元素help.pop();// 输出当前城市编号cout<<cur;// 如果栈不为空,输出空格分隔if(help.empty()) break;cout<<" ";}// 换行cout<<endl;return 0;     
}

~希望对你有启发!~


http://www.ppmy.cn/devtools/158486.html

相关文章

【Cocos TypeScript 零基础 15.1】

目录 见缝插针UI脚本针脚本球脚本心得_旋转心得_更改父节点心得_缓动动画成品展示图 见缝插针 本人只是看了老师的大纲,中途不明白不会的时候再去看的视频 所以代码可能与老师代码有出入 SIKI_学院_点击跳转 UI脚本 import { _decorator, Camera, color, Component, directo…

算法很美笔记(Java)——树

性质 树 上面的性质因为两个结点由一条边连成 结点数目越多&#xff0c;算法复杂度越高 二叉树 结构 层次遍历 利用队列&#xff0c;弹一个&#xff0c;加N个&#xff08;队列里弹出一个元素&#xff0c;就把这个元素的所有孩子加进去&#xff09; 具体来说&#xff1a;指…

开发完的小程序如何分包

好几次了&#xff0c;终于想起来写个笔记记一下 我最开始并不会给小程序分包&#xff0c;然后我就各种搜&#xff0c;发现讲的基本上都是开发之前的小程序分包&#xff0c;可是我都开发完要发布了&#xff0c;提示我说主包太大需要分包&#xff0c;所以我就不会了。。。 好了…

Office/WPS接入DeepSeek等多个AI工具,开启办公新模式!

在现代职场中&#xff0c;Office办公套件已成为工作和学习的必备工具&#xff0c;其功能强大但复杂&#xff0c;熟练掌握需要系统的学习。为了简化操作&#xff0c;使每个人都能轻松使用各种功能&#xff0c;市场上涌现出各类办公插件。这些插件不仅提升了用户体验&#xff0c;…

19vue3实战-----菜单子树的展示

19vue3实战-----菜单子树的展示 1.实现目标2.实现思路3.实现步骤3.1新建config配置文件3.2封装组件3.3使用组件 1.实现目标 如上,以上效果的难点是“在表格里面实现树形结构”。可以用element-plus框架中的table作为辅助: 可以自己查看文档了解怎么使用。 2.实现思路 上面的…

深入浅出学算法030-兔子繁殖

题目描述 有一种兔子&#xff0c;出生后一个月就可以长大&#xff0c;然后再过一个月一对长大的兔子就可以生育一对小兔子且以后每个月都能生育一对。现在&#xff0c;我们有一对刚出生的这种兔子&#xff0c;那么&#xff0c;n个月过后&#xff0c;我们会有多少对兔子呢&…

HTTP 请求头、响应头常见字段分析

目录 请求头AcceptAccept-EncodingUser-AgentConnectionCache-ControlHost 响应头Content-EncodingETagContent-TypeVaryx-business-use-case-usageAccess-Control-Allow-Originfacebook-api-versionStrict-Transport-SecurityPragmaCache-ControlExpiresx-fb-request-id 和 x-…

【C】链表算法题7 -- 环形链表||

leetcode链接https://leetcode.cn/problems/linked-list-cycle-ii/description/ 问题描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到…