dijkstra练习-紧急救援

【PTA】7-35 城市间紧急救援(Dijkstra最短路) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。 输入格式: 输入第一行给出4个正整数N、M、S、D,其中N(2≤N... 阅读详情

小练习记录贴03

点击跳转原题

题目描述

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

输入格式

输入第一行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0 ~ (N−1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。
第二行给出N个正整数,其中第i个数是第i个城市的救援队的数目,数字间以空格分隔。随后的M行中,每行给出一条快速道路的信息,分别是:城市1、城市2、快速道路的长度,中间用空格分开,数字均为整数且不超过500。输入保证救援可行且最优解唯一。

输出格式

第一行输出最短路径的条数和能够召集的最多的救援队数量。第二行输出从S到D的路径中经过的城市编号。数字间以空格分隔,输出结尾不能有多余空格。

输入样例

4 5 0 3
20 30 40 10
0 1 1
1 3 2
0 3 3
0 2 2
2 3 2

输出样例

2 60
0 1 3

解题思路

看到这题的时候我就想到用dijkstra(什么是dijkstra),最短路径问题嘛。但是题目要求除了找到最短路径花销还要找到那条救援队伍最多的线路。进而我想到用两次dijkstra,第一次先找到最短路径的值,第二次做dijkstra的时候加入比较,如果抵达D的时候花销和最短路径是一样的就进行回溯,回溯累加上每个point的救援队伍。然而这样做在pta上面只能拿到18分(满分25,有一个7分节点过不去)。

进而参考了其他coder的解题思路。%%%膜拜大佬的思路。

她在其中只用了一次dijkstra解决了问题。但是比我多增加了两个数组,一个是用来记录抵达当前位置路径数量的num数组,另外一个是记录抵达当前位置最多救援队伍数量的w数组。

前面的过程和普通dijkstra是一样的。后面更新数据分为两个情况:

  1. 如果当前节点A加上A到B的距离小于当前出发点到B的距离,就更新dist, num, w数组,dist数组不用说了。num[B]更新为num[A],因为现在A是更优的情况,所以抵达B的所有路线都必定要途径A,也就是说能到A的路都可以到B。w[B]更新为w[A] + team[B],原本B节点的队伍数量加上前面抵达A位置最多救援队伍数量。
  2. 如果当前节点A加上A到B的距离等于当前出发点到B的距离。num[B]更新为num[B] + num[A],相当于多了另外一条路能过来,而这另外一条路是必定经过A节点的,所以只用关注A的情况就可以了。w需要比较一下,如果当前这条路的队伍数量比前面路的救援数量要多,那么更新为w[A] + team[B];反之不更新。

另外需要注意的是,这是一个无向图,所以输入图的时候要更新两条边。

思路非常巧妙,值得反复学习。

AC代码

#include<iostream>
#include<vector>
using namespace std;
#define inf 0x3f3f3f3f

int mp[505][505]; //记录路径 
int team[505]; //记录救援队数量 
bool visited[505]; //标记是否到过了
int before[505]; //当前城市的前一个节点 
int dist[505]; //S到达这个点最短的距离
int num[505]; //记录路径数量
int w[505]; //记录最大权重 

void getPath(int point){
	if(point == before[point]) {
		cout << point;
		return;
	}
	getPath(before[point]);
	cout << " " << point;
}
int main(){
    int N, M, S, D; cin >> N >> M >> S >> D;
    for(int i = 0; i < N; i ++)
        cin >> team[i];
    for(int i = 0; i < N; i ++){
        dist[i] = inf;
        for(int j = 0; j < N; j ++)
            mp[i][j] = inf;
    }
    while(M --){
        int city1, city2, d; cin >> city1 >> city2 >> d;
        mp[city1][city2] = min(mp[city1][city2], d);
        mp[city2][city1] = min(mp[city2][city1], d);
    }
    dist[S] = 0; //有这个初始化就可以确保第一次dijkstrea 从S开始 
    w[S] = team[S]; 
	num[S] = 1; 
    int cnt = 0;
    while(cnt < N){
        //查找当前的最短距离的点
        int minDist = inf, point = -1;
        for(int i = 0; i < N; i ++){
            if(!visited[i] && minDist > dist[i]){
                minDist = dist[i];
                point = i;
            }
        }
        if(point == -1) break; 
        visited[point] = true;
        //更新 
        for(int i = 0; i < N; i ++){
        	if(visited[i]) continue; //当前确认的点一定是最短距离 
            if(dist[point] + mp[point][i] < dist[i]){//排除了mp[point][i]==inf的情况 
                dist[i] = dist[point] + mp[point][i];
                num[i] = num[point]; //抵达i的线路必定途径point 
				w[i] = w[point] + team[i];
				before[i] = point; 
            }else if(dist[point] + mp[point][i] == dist[i]){
            	num[i] += num[point]; //i之前没有和point连通,连通之后多了num[point]个线路 
            	if(w[point] + team[i] > w[i]){
            		w[i] = team[i] + w[point];
            		before[i] = point;
				}
			}
        }
        cnt ++;
    }
    cout << num[D] << " " << w[D] << endl;
    getPath(D);
    return 0;
}
数据结构习题-Dijkstra 数据结构习题Dijkstra 1.3、将二叉树看作图,并对它作图的深度优先遍历,则与原二叉树的 结果是相同的。 A、前序遍历 B、中序遍历C、后序遍历D、层次序遍历 1.4、在关于树的以下4种叙述中,正确的是 。 A、用指针方式存储有n个结点的二叉树,至少要有n+1个指针。 B、m阶B-树中,具有k个子结点的结点,必有k-1个键值。 C、m阶B-树中,每个非叶子结点的子结点个数≥[m/2]。 D、平衡树一定是丰满树。 1.5、在最好和最坏情况下的时间复杂度均为O(nlog2n)且稳定的排序方法是 A、希尔排序 B、快速排序 C、堆排序 D、归并排序 二、解答题 2.1、对目标串 abaabcc和模式串aabc,描述根据KMP算法进行匹配的过程,包括失效函数计算。答:失效函数:-1, 0, -1, -1 目标串 abaabcc和模式串aabc的KMP算法进行匹配的过程 abaabcc aabc 首先,从目标位置0和模式位置0开始比较,至ab和aa,不等时目标位置为1, 模式位置为1。因0位置失效函数的值( f [posP-1] ) 为-1,从目标位 置1和模式位置0开始新一轮比较。因第一个字符( posP == 0 )就不等,目标 位置增1,目标位置2和模式位置0开始新一轮比较,直到模式位置比较至4, 匹配成功。 int fastFind ( char *s, char * pat ){ //带失效函数的KMP匹配算法 int posP = 0, posT = 0; int lengthP = strlen(pat), lengthT = strlen(s); while ( posP < lengthP && posT < lengthT ) if ( pat[posP] == s[posT] ) { posP++; posT++; //相等继续比较 } else if ( posP == 0 ) posT++; //不相等 else posP = f [posP-1]+1; if ( posP < lengthP ) return -1; else return posT - lengthP; } 立即下载

相关推荐

【深度学习】肺结节分割项目实战一:处理数据集

一、LIDC-IDRI数据集简介 官方网站 肺图像数据库协会的图像收集(LIDC-IDRI)包括诊断和带有病变注释标记的肺癌筛查胸部CT。这是一个网络公开的国际资源,用于肺癌检测和诊断的计算机辅助诊断(CAD)方法的开发、培训和评估。 数据集包含1018个病例,每个病例包括来自临床胸部CT扫描的图像和一个相关的XML文件,该文件记录了由四名经验丰富的胸部放射科医生进行的两阶段图像注释过程的结果。在最初的盲读阶段,每个放射科医生独立审查每个CT扫描,并标记出属于三种类型之一的病变(“结节>= 3mm”,

weixin_42182906的博客 1万+

【图论习题集】(dijkstra, 匈牙利算法,更新至8873字)

前言:匈牙利算法的本质是DFS,就用那个男女朋友的例子为例,每个女生暗恋一个男生,我们先是假定第一个女生和他暗恋的第一个男生配对,接下来,我们考察第二个女生,如果这个女生也喜欢这个男生,那么我们先考虑第一位女生让步,让她取希望暗恋的第二个男生,如果成功,那么配对的数目自然就加一了,或者没有其他男生的话,只能让第二个女生去喜欢暗恋的第二个男生,一次类推。由于增广路径的正确性,我们得到的每一个都是当前女生数的最大匹配数,这里运用的动态规划的思想。注意:是有向的,我们把起点集合里的第一个点作为起点。

gfyy_bkj的博客 944

汽车ECU诊断入门:手把手教你用UDS协议(ISO14229)读取和清除故障码

本文详细介绍了如何使用UDS协议(ISO14229)进行汽车ECU诊断,包括故障码读取与清除的完整流程。从诊断环境搭建、UDS协议基础到实战案例分析,手把手教你掌握0x19诊断服务、安全访问机制等核心技能,适用于汽车电子工程师和诊断开发人员。

weixin_33701251的博客 459

dijkstra题目实战

目录常用模板一:朴素dijkstra算法模板模板题 AcWing 849. Dijkstra求最短路 I二:堆优化版dijkstra —— 模板题模板题 AcWing 850. Dijkstra求最短路 II 常用模板 一:朴素dijkstra算法模板 时间复杂是 O(n2+m)O(n2+m), nn 表示点数,mm 表示边数 int g[N][N]; // 存储每条边 int dist[N]; // 存储1号点到每个点的最短距离 bool st[N]; // 存储每个点的最短路是否已经确定

qq_52331221的博客 2209

HTTPDebugger实战:iTunes登录协议抓包与签名验证全解析

HTTPS抓包是分析客户端与服务端交互的重要手段,其原理是通过中间人证书解密TLS流量,从而观察请求与响应细节。在调试iTunes登录协议时,抓包能帮助我们定位签名验证失败、x-timestamp过期等棘手问题。然而,许多教程中常见的mumu模拟器抓包、fiddler手机抓包或charles抓包unknown问题,往往让新手陷入工具陷阱。本文以HTTPDebugger为切入点,从TLS握手到认证请求,系统拆解iTunes登录协议的关键字段与签名机制,覆盖证书配置、进程监听、域名过滤等实战经验,辅以Apple

weixin_30768881的博客 199

高通Sensor Tuning实战:手把手教你用Chromatix生成并打包bin文件(附避坑指南)

本文详细介绍了高通Sensor Tuning的全流程实战,从Chromatix配置到Bin文件加载验证。通过手把手教程,帮助开发者掌握Chromatix工具链的使用,避免常见配置错误,提升调试效率。特别针对kalama等新一代平台,提供经过验证的解决方案和避坑指南。

ios99的博客 483

Dijkstra算法基础详解,附有练习题

Dijkstra算法是一种用于求解单源最短路径问题的经典算法。它可以在给定有向加权图(无向是特殊的有向)中,从一个起点到其他所有节点的最短路径。

clmm_的博客 919

OCV/AOCV/SOCV的介绍和应用

library中的cell delay是在某个固定的PVT(operating condition)下仿真得出的。,cell的delay并不是一个固定值,而是一个随机值,遵循高斯分布或门特卡洛分布,在STA中用OCV来模拟这一『特征』。OCV全称on chip variation,用于描述不同管子间由于工艺偏差、电压降、温度变化引起的delay变化。,也用于描述工艺偏差引起的net厚度宽度的变化从而导致net的电容电阻变化。优点:设置起来比较简单粗暴,对于不那么先进的工艺可行!的影响,更贴合实际。

m0_61003348的博客 8984

dijkstra模板及例题(最短路算法)

dijkstra算法、模板及例题

weixin_61017400的博客 1万+

在WPS/Office中免费使用AI,快速提升办公效率!​

《免费解锁WPS/Office AI办公神器教程》摘要: 本教程详解如何通过第三方插件OfficeAI免费实现WPS/Office智能办公,突破官方付费限制。从安全设置到安装配置,手把手教学,涵盖文档生成、PPT美化、Excel图表等核心功能。关键优势包括零成本、全场景支持及云端/本地双模式切换,并附常见问题解决方案。注意需使用WPS 2024+版本,安装时需临时关闭杀毒软件。教程强调工具来源合法性,建议商用购买正版授权。(149字)

杜哥无敌的博客 2307

数据仓库建模的步骤-从需求分析到模型优化的全面指南

数据仓库建模是一个系统化的过程,旨在设计和构建一个高效、可扩展的数据存储和分析环境。它的目标是将来自不同源系统的数据整合到一个统一的、面向主题的、随时间变化的数据集合中,以支持企业的决策制定过程。数据仓库建模不仅仅是创建表格和定义关系,它更是一门艺术,需要平衡业务需求、技术限制和未来的可扩展性。提供快速的查询性能支持复杂的分析需求适应业务的变化和增长保持数据的一致性和准确性接下来,让我们深入探讨数据仓库建模的每个主要步骤。

一个8年大数据开发工程师的碎碎念 2105

L2-001 紧急救援(dijkstra算法练习)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

shuyuan12346的博客 1118

华为OD机试 - 字符串筛选排序 - 数组(Python/JS/C/C++ 双机位C卷 100分)

k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果第k个最小ASCII码值的字母存在重复 则输出该字母的最小位置索引。输入一个由N个大小写字母组成的字符串,按照ASCII码值从小到大进行排序,查找字符串中第K个最小ASCII码值的字母(k>=1)。k如果大于字符串长度则输出最大ASCII码值的字母所在字符串的位置索引,如果有重复字母则输出字母的最小位置索引。输出字符串中第k个最小ASCII码值的字母所在字符串的位置索引。第二行输入k ,k必须大于0 ,k可以大于输入字符串的长度。

学Java,找哪吒 1392

dijkstra + dp,PTA 天梯赛练习集L2-001 紧急救援

刷下天梯赛的题

EQUINOX1的博客 362

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

pta紧急救援java_团体程序设计天梯赛-练习集L2-001. 紧急救援(dijkstra)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。输入格式:输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便...

weixin_39634884的博客 394

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

天梯赛练习集——L2-001 紧急救援(dijkstra求最短路)

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

2301_79363050的博客 631

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

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

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。 输入格式: 输入第一行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是快速道路的条数;S是出发地的城市编号;D是目的地的城市编号。第二行给出N

一粒大榴莲的博客 417

【PTA练习】L2-001 紧急救援 (25 分! 18分没a必看)Dijkstra模板以及本题测试点详解

L2-001 紧急救援 (25 分) 试题链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805073643683840 这次自己总结一下Dijkstra算法!(题目在后半部分,看题解的直接跳转后半段吧) Dijkstra算法 Dijkstra算法 邻接矩阵代码模板:(适合图的点数不超过1000的情况) 1.初始化...

爱放火的安小妮的博客 1万+

团体程序设计天梯赛-练习集 L2-001 紧急救援 dijkstra 解题报告

L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援

小夥的博客 1975

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

L2-001. 紧急救援 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他...

weixin_30835923的博客 188

PAT 团体程序设计天梯赛-练习集 L2-001. 紧急救援 【dijkstra】

题目链接http://blog.youkuaiyun.com/tc_to_top/article/details/51427223思路题意是求个最短路,要求路径长度和最短的前提下,点权和最大,并求出长度相等的最短路有几条,并输出路径,是dijkstra的灵活运用。这种题好像写过很多遍了,但这次还是不能一次过,调试了半天。点权和最大很好解决,给dis加一个属性就可以了。输出最短路径,可以用一个数组记录每个点的前驱

初涉_代码世界 2539

PTA天梯赛-练习集L2-001 紧急救援

作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。

Vampire_117的博客 811

PTA L2-001 紧急救援-最短路(Dijkstra)多条最短路找最优解并输出路径 团体程序设计天梯赛-练习集...

L2-001紧急救援(25分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时候,你的任务是带领你的救援队尽快赶往事发地,同时,一路上召集尽可能多的救援队。 输入格式: 输入第一行给出4...

weixin_30652879的博客 199

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

本文探讨了基于Dijkstra算法的多目标最短路径优化问题。通过邻接表存储图结构,使用优先队列实现Dijkstra算法,同时维护三个关键数组:记录最短路径数的dp数组、存储最大救援队数的person数组以及记录前驱节点的qianqu数组。在算法执行过程中,当发现更短路径时更新距离和前驱节点,遇到等长路径时则累加路径数并比较救援队数量。最后输出三个结果:最短路径数量、最大救援队总数以及具体路径。该算法综合运用了动态规划和贪心思想,在保证路径最短的前提下,实现了救援队数量最大化的目标。

2501_91263296的博客 338

L2-001 紧急救援

用堆优化的dijskstra,L2-001 紧急救援。

weixin_62063623的博客 214

PAT : 团体程序设计天梯赛-练习集 L2 答案

2019/03/18 完成01-02 2019/03/19完成03 2019/03/20 完成04 2019/03/21完成05(unordered_set) 2019/03/22完成05(手写哈希),06 2019/03/23完成07 L2-001紧急救援(C++11) #include <iostream> #include <stack> #...

Belous的博客 2842
上一篇: 二分练习-眼红的Medusa
下一篇: map练习-链表去重
Ayu阿予
博客等级 码龄5年 456粉丝 47原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ayu阿予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值