爆刷PAT(甲级)——之【1003】 Emergency (25)——最短路简单变形

QuickFix Java 讲解(五)消息的收发与查看 本系列力求手把手教你怎样利用QuickFix Java 搭建自己的 FIX 协议收发平台,以及其中的注意事项。 所有源码的地址(免费): https://github.com/zongzhec/QuickFixPractise 这节我们讨论将Acceptor和Initiator启动以后,收到的消息极其查看方式。 6. 收发双方的通信 6.1. 启动后的通信和登录 为方便起见,这里我们使用统一的源码:https://github.com/zongzhec/QuickFixPractise .. 阅读详情

题意:   N个城市M条边,边是无向变。每个边有权值,以及每个城市都有某个数量的人。

       给出起点城市和终点城市,要求从起点到终点的最短距离条件下的—— 路径数,以及最多能捎上多少人!(路径上城市的人数和最大)

难点:

      数据量N小于500。作为PAT第三题,是最短路的路径数问题以及小变形。Dijkstra、Bellman什么的基本操作都学过,但是一是忘了大半,二是没有吃透。所以今天做这个简单的小变形,1个半小时还没有做出来。较难以理解如何    “在松弛点上如何变形”  。 

      参照了别人的AC代码,果不其然是在松弛点上操作。要分别将 “路径数”的维护操作  以及  “路径经过的最大人数”  维护操作,在松弛操作时候一同联系进去,说实话,虽然知道代码怎么写,但还是没有理解为什么可以这样。。。。

      这种小变形应该是算很简单的小变形, 以至于各位江湖朋友写博客都不写为什么这么写,往往只是写 “Dijkstra的小变形” 。。。。emmmm   ,睡了一觉,第二天清醒 的脑袋,一下就理解了为什么可以这样写。。。虽然我还是解释不清啊。。。

 

1、本题我使用的是Dijkstra算法

2、每一轮找到最近未标记过点u之后,按照Dijkstra算法,接下来是用点u去尝试松弛剩下的所有点。在这里:

  如果通过点u,无法松弛某点 i ,但是路径大小相同,那么这可能就是一条新的最短路径,那么到达 i 点的方法数 = 自己原本的值 + 到u点方法数 。

  如果通过点u,无法松弛某点 i ,但是路径大小相同,说明当前路径是最短路径的一条!所以还要考虑,对“最短路径”的最大人数进行维护。 如果  (到u点时能捎上的最大人数  +  i点本身城市驻扎人数)  > (当前记录的 i 点能捎上的最大人数) ,就更新这个值。

  如果 可以通过点u,松弛某点 i 时,那么此点的最短路径必然更新,如果最短路径都更新了,那么  最大人数  肯定也要 “覆盖” !

3、 我写的Dijkstra模板比较懒,写完以后,跑出来的“最大人数”的结果一直都比样例大。百思不得其解。观摩了别人的AC代码之后,才最后终于明白是因为我的代码里,松弛的循环部分少了 一句 (if(!book(i))) ,加上就AC了。但是,为什么呢?

想了一会明白——我精简这个模板的时候,可以删去了这句话,是因为,只讨论最短路的Dijkstra时候,每一次被选中的松弛点,必然是没有被标记过的剩下的点中,和起点距离最近的点!这是Dijkstra找 松弛点的算法本质。  而下一步的松弛循环中,用松弛点对松弛点本身进行松弛,是不会影响结果的!

但是,对最短路进行变形的时候,因为引入了一个 “最大人数” 的维护与讨论,在松弛阶段,用松弛点对松弛点进行松弛的话,会导致 “误判” 的,对 “最大人数” 的重新累加。就会导致结果翻倍!

也就是说,如果我把代码的(if(!book(i))) 改成 (if( i!=u  )) 也是可以的!因为他们的目的都已经达到了,就是不对松弛点u重新松弛即可!

 

终于AC了,学到了学到了。我对Dijkstra还是不够了解呐。

Code:

我的这个代码中,用的就是if( i!=u  )来防止松弛点重复松弛了,给自己一个警戒。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define inf 509
#define INF 0x3f3f3f3f
#define loop(x,y,z) for(x=y;x<z;x++)

int n,m,s,g;
int men[inf];//每个城市的救援人数
int path[inf][inf];//路径矩阵
int book[inf],dis[inf],rescue[inf];//标记,最短距离,以及到i城市最多能集合多少救援人员
int num[inf];

void Input()
{
    int i,j,u,v,t;
    scanf("%d%d%d%d",&n,&m,&s,&g);

    loop(i,0,n)         //忘记输入n后初始化了。。
        loop(j,0,n)
        path[i][j]=(i==j)?0:INF;
    memset(book,0,sizeof book);
    memset(num,0,sizeof num);//初始化方法数,起点为1
    num[s]=1;//起点到达方法数初始化为1

    loop(i,0,n)scanf("%d",&men[i]);
    loop(i,0,m)
    {
        scanf("%d%d%d",&u,&v,&t);
        path[u][v]=path[v][u]=t;
    }
}

void Dijkstra()
{
    int i,j,k,u,mini;

    loop(i,0,n)dis[i]=path[s][i];
    rescue[s]=men[s];      //要初始化

    loop(j,0,n)
    {
        mini=INF;
        loop(i,0,n)
            if(!book[i]&&dis[i]<mini)
                mini=dis[u=i]; //找最小
        book[u]=1;//标记
        //松弛
        loop(i,0,n)// !book[i]
        if(i!=u){
            if(dis[i]>dis[u]+path[u][i])
            {
                dis[i]=dis[u]+path[u][i];//缩短边
                num[i]=num[u];

                //如果当前的路径是最短路,那么路径上的救援人数当然应重新赋值
                //因为以前的救援人数已经不是“最短的路径”上的了
                //救援队最大队伍,等于能到达U点的人数,加上I点城市自己的人数
                rescue[i]=rescue[u]+men[i];
            }
            else if(dis[i]==dis[u]+path[u][i])
            {
                //如果通过u点到达i点的距离相同,
                //那么到达u点的方法数就会累加到到达i点的方法数上
                num[i]+=num[u];

                //如果当前路径也是最小的,那么就要判断(维护)当前的最大救援人数值了
                rescue[i]=max(rescue[i],rescue[u]+men[i]);
            }
        }
    }
}

void Output()
{
    printf("%d %d\n",num[g],rescue[g]);
}

int main()
{
    Input();
    Dijkstra();
    Output();
    return 0;
}

 

解锁Jetbrains AI助手:中国开发者实战配置与效率跃迁指南 本文为中国开发者提供了一份详细的Jetbrains AI助手实战配置指南。针对服务地域限制,核心解决方案是通过修改Jetbrains账户区域信息并配置网络代理,实现插件的稳定启用。文章进一步分享了AI助手在解读遗留代码、生成中文提交信息、智能问答等场景下的具体应用,旨在帮助开发者深度集成这一工具,实现编码生产力的显著提升。 阅读详情

相关推荐

kali设置安装burpsuite中文版

工具:通过网盘分享的文件:Burpsuite 链接:提取码: jay1。

m0_74786138的博客 5202

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

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

HLY:) 的博客 1887

禅道18.3版本二开避坑指南:手把手教你扩展自定义报表功能

本文详细介绍了禅道18.3版本的二次开发实践,重点讲解如何扩展自定义报表功能。通过zentaoPHP框架的深度定制,从开发环境搭建到核心数据模型扩展,再到可视化配置和性能优化,手把手教你构建多维报表分析系统,满足企业级项目管理需求。

day7的博客 370

[PAT甲级]1003 Emergency超详细题解+AC代码

以下所述均为个人理解,如有错误,还望指正。

zzylalalala的博客 412

扫地机器人:从仿真到决策,一个完整SLAM导航系统的自研之路

本文详细记录了从零开始自研扫地机器人SLAM导航系统的全过程,涵盖ROS-Gazebo仿真系统搭建、地图预处理优化、全覆盖规划算法迭代等关键技术。通过三次算法升级,最终实现92%的清洁效率,并分享DWA调参、状态机设计等实战经验,为开发者提供从仿真到落地的完整解决方案。

weixin_29053695的博客 352

如何在 Windows 11 上安装 ChatGPT:CMD + 图形界面两种方式

我没说在 Windows 11 上装 ChatGPT 应用有多难,但你要是知道有哪几种官方途径可用,事情就会顺一点,尤其是对新手。对大多数用户来说,商店应用就是正确的选择。如果你在受管理的设备上,或者想避开商店,那么通过 Edge 或 Chrome 装 PWA 是完全站得住脚的替代方案。不管你选哪条路,真正的收获都是把 ChatGPT 从浏览器标签页里挪出来,放进一个它真正像个工具的地方。把它固定到任务栏、配好 Alt + 空格,你就会纳闷以前没它是怎么干活的。

山岚的运维笔记 290

PAT 甲级1003 Emergency 题解

PAT 甲级 1003 Emergency 解题思路

qq_36404766的博客 692

手把手教你用STM32H743+FreeRTOS+LWIP搭建物联网网关(附完整工程)

本文详细介绍了如何使用STM32H743微控制器结合FreeRTOS实时操作系统和LWIP协议栈构建高性能物联网网关。内容涵盖硬件配置、FreeRTOS任务设计、LWIP协议栈优化及物联网协议集成,提供完整工程示例,助力开发者快速实现稳定可靠的网络通信枢纽。

weixin_42623010的博客 502

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 in each city and the length of each road between any pair of cities are m..

m0_53210180的博客 180

STM32F103C8T6心电采集实战:从PCB设计到上位机开发的完整指南(附TI杯开源资料)

本文详细介绍了基于STM32F103C8T6的心电采集系统开发全流程,从PCB设计到上位机开发,特别适合大学生电子设计大赛参赛者参考。内容涵盖硬件设计精要、软件算法优化及上位机开发技巧,并附TI杯开源资料,帮助开发者低成本实现医疗级心电信号采集。

kafka6courier的博客 193

垂直领域论坛数据挖掘:Python突破Discuz!加密与用户画像构建指南

在垂直领域论坛,如专业技术论坛、兴趣爱好社区等,积累了大量有价值的信息和用户数据。这些数据不仅可以帮助我们了解用户的行为模式和兴趣点,还能为社区运营、产品优化、商业决策等提供有力支持。然而,许多基于Discuz!系统的论坛对数据进行了加密保护,给数据挖掘带来了一定的挑战。本文将详细探讨如何使用Python突破Discuz!论坛的加密机制,并构建用户画像,实现数据掘金。

u014481728的博客 1693

PAT 甲级 1003 Emergency

题目描述的大致意思是:作为一个城市的紧急救援队领导,你得到了一份特殊的国家地图。地图上显示有几个分散的城市,它们之间由一些道路连接。地图上标记了每个城市的救援队数量以及任意两个城市之间道路的长度。当你从其他城市接到紧急呼叫时,你的任务是尽快带领你的队伍到达目的地,并在途中召集尽可能多的援助。要求一个起点到另一个终点的最短路径数目和最大权重,用迪杰斯特拉算法。有N个城市,M个路,L是路的长度,C1是起点,C2是终点。

王卡卡用于自我提高和记录学习生活的博客 571

AI爬虫:一文讲通AI爬虫技术和原理,及34个AI爬虫工具推荐

AI 爬虫 是一种结合了传统网络爬虫技术和人工智能(AI)技术的工具,能够更智能、高效地从网页中提取和处理数据。与传统爬虫相比,AI 爬虫能够更好地处理动态内容、复杂网页结构以及非结构化数据,同时具备数据清洗、分类、情感分析等高级功能。

数据知道的博客 1万+

PAT甲级1003 Emergency

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

优快云_Lrcx的博客 268

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

PAT甲级1003. Emergency (25)(Dijkstra变形)

1003. Emergency (25)时间限制400 ms内存限制65536 kB代码长度限制16000 B判题程序Standard作者CHEN, YueAs an emergency rescue team leader of a city, you are given a special map of your country. The map shows several scattered...

du_lun的博客 244

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

PAT 甲级试题1003 Emergency (25) dijkstra变形应用

传送门:Emergency (25) 题意:给定一张图,每个点有点权,每条边有边权,问从s点出发到t点的最短路径有几条,这些最短路径中的点权集合的sum最大是多少。 思路:一开始想到了用dijkstra,也想到了要稍微变形一下,在松弛的时候如果发现路径长度相等就要加上额外的路径数,但是老是觉得不对,自己否定自己,并且也没想出来该怎么求最大点权集合。 最后看了题解以后才发现自己好

WA是一笔财富 501

1003 Emergency-PAT甲级

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 l...

amf12345的博客 184

PAT甲级 1003. Emergency (25)

1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emergency rescue team leader of a city, yo

超越自我就是成功 333

PAT 甲级真题 1003 Emergency (25分) c语言实现

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

xiejianhao1的博客 622

PAT甲级真题 1003. Emergency

题目链接:https://www.patest.cn/contests/pat-a-practise/1003题意,给我们n个点,有m条路,每个点都有一个权值,每一条路都有自己的长度且都是双向的路,让我们求从起点s,到终点e之间的最短路径数量,且求出在这些最短路程中所有点权值和最大的一条的权值和。仔细分析,这题应该是最短路径的变形题目(如果最短路不熟练的同学可以出门左转先去学习最短路:传送门),首...

RaAlGhul的博客 843

【PAT A-1003】Emergency

PAT 甲级 1003. Emergency 题意概述 地图上有一些分散的城市,这些城市通过一些双向道路相连。地图上标出了每个城市的救援队数量以及每对城市之间的每条道路的长度。当从其他城市接到紧急电话时,你需要尽快到达该城市,同时在途中尽可能多地召集救援队。 输入输出格式 输入第一行包含 4 个正整数:N、M、C1、C2,分别表示城市数量(城市从 0 到 N-1 编号)、道路数量、当前所在的城市和要到达的城市。接下来一行包含 N 个整数,其中第 i 个整数是第 i 个城市中救援队的数量。接下来 M 行,每行

我真的不是cjcの博客 645

PAT (Advanced Level) 甲级 1003 Emergency

对于路径个数的话,我采用的是乘法原则,就是求出到达每个节点的最短路径个数,然后将这些进行相乘,也就是每次找到相同最短的,就加上一遍,具体是用droad实现的。这题是个很经典的问题,求出从C1到C2的最短路,并且要保证,每次经过每一个节点的值总和要最大,并且求出最短路径的个数。比较经典的迪杰斯特拉的变形吧。

qq_61793850的博客 158

PAT 1003 Emergency满分 测试点问题记录

PAT 1003 代码 #include<iostream> #include <string> #include<map> #include<algorithm> using namespace std; int n, m, c1, c2; int roads[510][510], weight[510]; bool mark[510]; const int inf = 99999999; int mindis=inf; int maxhands

qq_45092173的博客 641

PAT 甲级 1003. Emergency 使用 优先队列 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 the l...

zerou8400的博客 315

1003 Emergency(Dijkstra,Bellman-Ford,SPFA三种解法)

1. Dijkstra解法 这题不仅涉及到基础的解法,还涉及到第二标准(累计军队数量),以及还要记录最短路径条数。这些都是在绷紧路径的if语句中修改,我认为自己在这里的嵌套判断写法(先判断该结点是否已被访问过再进行下一步)比书上的复合条件句要清楚 //绷紧路径 for(int j=0;j<city[minC].nbr.size();j++){ int nbr = city[minC].nbr[j].no; if(vis[nbr]==0){ if(d[minC]+city[minC].nb

行步至春深 546

1003 Emergency

1003 Emergency

bradyM的博客 282

PAT真题(C语言)——1003:Emergency

题目如下: 这道题是一道典型的求最短路径,我采用的是Dijkstra最短路径算法。 和传统的最短路径不同的是,这道题里的节点间举例不是用一个N*N矩阵表示,而是分别列出了每条路径的起始城市、终点城市和路径长度。 这道题花了我不少时间,主要调了很久的bug终于调通,先把整个流程大致讲一下,例子就用题目中给出的例子。传统的Dijkstra算法的流程如下: 下表中,最左边一列代表不同的终点,表格内容中...

weixin_43857778的博客 637
上一篇: 【C++】使用memset赋值,以及“无穷大”的十六进制讲解~~
下一篇: 爆刷PAT(甲级)——之【1004】 Counting Leaves (30)——树上简单dfs搜索
仰天倀笑
博客等级 码龄10年 313粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值