[PAT甲级]1003. Emergency (25)(求城市间最短路径和最大救援队数目)

1003. Emergency (25)-PAT甲级真题(Dijkstra算法) 1003. Emergency (25)As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in... 阅读详情

1003. Emergency (25)

原题链接

As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length of each road between any pair of cities are marked on the map. When there is an emergency call to you from some other city, your job is to lead your men to the place as quickly as possible, and at the mean time, call up as many hands on the way as possible.

Input

Each input file contains one test case. For each test case, the first line contains 4 positive integers: N (<= 500) - the number of cities (and the cities are numbered from 0 to N-1), M - the number of roads, C1 and C2 - the cities that you are currently in and that you must save, respectively. The next line contains N integers, where the i-th integer is the number of rescue teams in the i-th city. Then M lines follow, each describes a road with three integers c1, c2 and L, which are the pair of cities connected by a road and the length of that road, respectively. It is guaranteed that there exists at least one path from C1 to C2.

Output

For each test case, print in one line two numbers: the number of different shortest paths between C1 and C2, and the maximum amount of rescue teams you can possibly gather.
All the numbers in a line must be separated by exactly one space, and there is no extra space allowed at the end of a line.

Sample Input

5 6 0 2
1 2 1 5 3
0 1 1
0 2 2
0 3 1
1 2 1
2 4 1
3 4 1

Sample Output

2 4

题目大意:

  • 第一行给定n个城市,城市之间有m条路,给定起点c1,终点c2
  • 第二行给定每个城市有救援队数目(点权)
  • 接下来m行给出路径信息 每条路给定起点,终点,路径长度(边权)
  • 输出c1到c2的最短路径条数(可能有多条路径,长度相等),输出最短路径中能带去的最大救援队数量(即最短路径上的最大点权)
  • 其实就是求无向图中两节点间最短路径

思路:

  • 第一反应想到了前段时间算法分析课上学到的动态规划备忘录方法,但是,自己最终还是没有最做出来
  • 后来查查别人的方法,用的是dijkstra算法,其实就是动态规划。
  • 想了解算法的解析博客可以自行百度
  • 我做这道题参考了这个博客,点击链接,具体分析看代码注释

代码:

//求无向图两结点间的最短路径数目,并求出最短路径的最大点权
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
//城市数目n 路径总数目m 起点c1  终点c2
//dis[i]表示起点到i点的最短路径长度
//weight[i]表示i城市救援队数目,     e[a][b] 表示从a到b路径长度
//num[i]表示从出发点到i城市拥有的最短路径的条数,w[i]表示最短路径上能够找到的救援队的最大数目
int n, m, c1, c2;//默认0
int dis[501],weight[501],e[501][501],num[501],w[501];//默认0
bool visit[501];//默认false
const int inf = 99999999;//常数
int main()
{
    //初始化
    scanf("%d%d%d%d",&n, &m, &c1, &c2);
    for(int i=0; i<n; i++)
        scanf("%d", &weight[i]);
    fill(e[0], e[0]+501*501, inf);//赋值
    fill(dis, dis+501, inf);
    for(int i=0; i<m; i++){
        int a, b, c;
        scanf("%d%d%d", &a, &b, &c);
        e[a][b] = c;//记录路径长度
        e[b][a] = c;//无向图,所以记录双向路径长度
    }
    dis[c1] = 0;
    w[c1] = weight[c1];
    num[c1] = 1;
    for(int i=0; i<n; i++){
        int u=-1,minn = inf;
        for(int j=0; j<n; j++){
            if(visit[j]==false && dis[j]<minn){
                u = j;
                minn = dis[j];
            }
        }
        if(u == -1)
            break;
        visit[u] = true;
        for(int v=0; v<n; v++){
            if(visit[v]==false && e[u][v]!=inf){//路径不包含v点 且u到v点有路径
                if(dis[u] + e[u][v] < dis[v]){//找到更短的路径
                    dis[v] = dis[u] + e[u][v];//最短路径长度更新
                    num[v] = num[u];//最短路径数量更新
                    w[v] = w[u] + weight[v];//最短路径点权更新(救援队数目)
                }else if(dis[u] + e[u][v] == dis[v]){//路径与最短路径长度相等
                    num[v] = num[v] + num[u];//最短路径数量更新
                    if(w[u] + weight[v] > w[v])
                        w[v] = w[u] + weight[v];
                }
            }
        }
    }
    printf("%d %d", num[c2], w[c2]);
    return 0;
}

注意:

  • 在main方法里定义的变量一定要赋初值,否则系统会随机赋值的。
  • 另外推荐两个链接,人家的题解写的很棒,链接1, 链接2,DFS
1003 Emergency (25)(25 分)Dijkstra算法 题目 As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and... 阅读详情

相关推荐

PAT甲级 1003 Emergency Dijkstra应用

Dijkstra应用

polarours的博客 856

LeetCode 1003. 检查替换后的词是否有效

题目链接 题目描述: 给你一个字符串 s ,请你判断它是否 有效 。 字符串 s 有效 需要满足:假设开始有一个空字符串 t = “” ,你可以执行 任意次 下述操作将 t 转换为 s : 将字符串 “abc” 插入到 t 中的任意位置。形式上,t 变为 tleft + “abc” + tright,其中 t == tleft + tright 。注意,tleft 和 tright 可能为 空 。 如果字符串 s 有效,则返回 true;否则,返回 false。 示例 1: 输入:s = "aabcbc"

qq_45636631的博客 488

Dijkstra算法求任意两个城市之间最短路径

根据所给的全国地图建立相应的数据存储,使用Dijkstra算法求任意两点间的最短路径,选择出最短的路径。

LeetCode刷题---栈---1003

我们遍历字符串,将字符串一个一个入栈,如果不是 'c' 的话,就直接入栈,如果是 'c' 就判断一下此时栈顶是不是 'b' ,如果不是直接返回false,如果是将 'b' 出栈,然后判断栈顶元素是不是 'a',如果不是直接返回false。最后判断栈中是否还有元素,如果还有就返回false,如果没有就返回true。因此,"abcabcababcc" 有效。执行操作无法得到 "abccba"。需要满足:假设开始有一个空字符串。因此,"aabcbc" 有效。

qq_47876165的博客 441

求两个城市之间的最短路径

数据结构课程设计:求两个城市之间的最短路径问题用c语言编写大家尽管用啊不必客气

城市最短路径查询(C语言)

C语言设计城市最短路径查询,含程序代码,可以作为人工智能之类的大作业

【算法】图的应用之求两个城市间的最短路径--FloydWarshall算法

【算法】图的应用之求两个城市间的最短路径

LX18792732127的博客 5291

2026款拯救者Y9000P深度学习环境配置指南

这套环境适配 2026 款拯救者 Y9000P 的 RTX5060,可直接用于 CV(图像分类、检测)、NLP 等 PyTorch 深度学习任务,GPU 利用率正常,无兼容性问题。后续复现环境时,直接按本文步骤操作即可~

大糊涂虫 2646

PAT 甲级题目讲解:1003《Emergency》

本文详细讲解 PAT 甲级 1003《Emergency》题目的解法。该题要求在带权无向图中求解从起点到终点的**最短路径数量**,以及所有最短路径中能召集的**最大救援队总数**。文章采用 **Dijkstra 算法** 作为核心框架,扩展维护 `cnt[]`(路径计数)与 `maxr[]`(最大点权和)两个状态数组,并提供链式前向星建图、完整 C++ 代码、常见错误总结与复杂度分析。

qq_35624947的博客 1201

matlab锅炉 pid仿真,基于Matlab锅炉仿真.doc

基于Matlab锅炉仿真内蒙古科技大学MATLAB课程设计任务书2012题 目:锅炉汽包水位控制系统学生姓名:林三彪学 号:0967112127专 业:测控技术与仪器班 级:2009-1指导教师:梁 丽摘 要锅炉是化工、炼油、发电、造纸和制糖等工业生产过程中必不可少的重要动力设备。锅炉往往成了不少工厂不可缺少的一部分,因而,对锅炉设备中的自动控制系统进行分析研究是必要的...

weixin_29133981的博客 1096

别再乱刷了!《另一个伊甸》异节、改典、典录获取途径完全梳理,这些隐藏奖励你拿全了吗?

本文全面解析《另一个伊甸》中异节、改典、典录的获取途径,包括断章、外传、精灵试炼等高概率掉落副本,以及隐藏任务、限时活动和特殊挑战。提供高效收集策略和优先级建议,帮助玩家快速获取这些稀缺资源,实现角色真证和上限突破。

weixin_42699679的博客 597

PAT甲级 1003 Emergency

PAT甲级 1003 Emergency As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams i...

旺崽的博客 2943

Caffeine:为每个元素动态设置过期时间

Caffeine利用expireAfter方法实现为每个元素动态设置过期时间

大数据开发、JAVA开发、人工智能AI 1万+

PAT 甲级1003 Emergency 题解

PAT 甲级 1003 Emergency 解题思路

qq_36404766的博客 692

Oracle 11g版本下载及安装超详细教程图解

新手Oracle安装教程

weixin_43738344的博客 10万+

TP4056在单节锂电池充电管理中的创新应用与电路优化

本文深入探讨了TP4056线性充电管理芯片在单节锂电池充电电路中的创新应用与优化方案。针对“边充边用”的核心挑战,文章详细解析了利用PMOS管构建智能供电切换电路的原理,实现了外部电源与电池供电的无缝、安全切换,有效杜绝了电池“边充边放”的风险。同时,提供了关键的元器件选型、PCB布局布线技巧及常见问题排查指南,为创客和硬件开发者提供了高性价比、高可靠性的锂电池电源管理实践方案。

rock5的博客 501

PAT甲级1003 Emergency

PAT甲级1003 Emergency 给定所有城市的救援队数量,和每相邻的两个城市之间的距离,给出从某个城市到某个城市的最短路径的条数,然后输出最大的那个救援队数量的个数。 核心是狄杰斯科特算法求最短路径,这个题只不过是这个算法的变体而已。 import java.util.Scanner; //需要知道走过的路径,因为需要打印救援队的数量 //路径距离相同的情况下,输出救援队数量最多的哪一个 ...

优快云_Lrcx的博客 270

定位教程7---旋转中心标定之方法二

手算相机相对机器人关系

Quintin 6230

【PAT甲级】1003 Emergency

📣专栏定位:为想考甲级PAT的小伙伴整理常考算法题解,祝大家都能取得满分!

Newin2020的博客 491

OpenClaw实战系列02:企业微信接入完全指南

本文详细介绍了如何将OpenClaw与企业微信对接,实现智能机器人功能。主要内容包括:企业微信侧创建智能机器人或自建应用,获取必要凭证和权限;OpenClaw侧安装配置企业微信插件,设置通信通道;完成双向验证并进行功能测试。文章提供了详细的配置步骤、常见问题排查方法和进阶玩法,帮助用户在30分钟内完成对接。关键点包括:确保URL可访问、Token一致、网关正常运行,以及针对不同部署环境(云服务器/内网)的配置差异。

PeterPan的博客 3814

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PAT甲级-1003 Emergency

PAT甲级-1003 Emergency题目中文题目 题目 1003 Emergency (25分) As an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered cities connected by some roads. Amount of rescue teams in each city and the length

qq_45588569的博客 256

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

PTA甲级刷题1003 Emergency(详细注释版+思路总结)

目录看这里大哥们!PTA甲级刷题笔记(C++)1003 Emergency(最短路径搜索)(1)题目(2)代码功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 PTA甲级刷题笔记(C++) 你好! 这是你第一次使用 Markdown

HLY:) 的博客 1887

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

PTA甲级1003 Emergency dijkstra算法求最短路径

思路:图的最短路径问题,需要求图的最短路径个数以及最大救援数量。

qq_73647271的博客 729

PAT(甲级)1003 Emergency (25 分)

题目来源: PAT(甲级)1003 Emergency (25 分) 题目描述: Sample Input: 5 6 0 2 1 2 1 5 3 0 1 1 0 2 2 0 3 1 1 2 1 2 4 1 3 4 1 Sample Output: 2 4 题目翻译: 作为一个城市的紧急救援队队长,你会得到一张你所在国家的特别地图。这张地图显示了几个分散的城市,由一些道路连接起来。地图上标出了...

sinat_41835935的博客 249

PAT甲级1003Emergency

寻找路径最短的种类数并输出最短路径的最多救援队数量。

song0789的博客 1364
上一篇: [PAT乙级]1068. 万绿丛中一点红(20)
下一篇: [PAT甲级]1001. A+B Format (20)(AB和的标准输出)
whl_program
博客等级 码龄11年 101粉丝 279原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值