PAT-Apat甲级题1003(python和c++实现)下

news2024/12/24 1:25:35

PTA | 1003 Emergency

书接上回,上次我们使用了python实现无向带权图与DFS算法的设计,本次我们将使用C++对本题进行解答,思路和题目分析同上一节内容,本次我们将在上一节的基础上继续实现。

okok现在又是激动人心的手搓代码时间:(代码思路来自哔哩哔哩)

 首先,定义以下全局变量:

        1, int N, M, C1, C2; 输入变量:城市数量,道路数量,起始城市, 终点城市
        2,  int path, teams; path表示路径数量,teams表示经过每个城市的最多的队伍数量
        3, int num_of_team[500] = {0};表示每个城市的队伍数
        4, int distence[500][500];距离矩阵
        5, int mindis[500];最短路径数量
        6, vector<int> v[500];用于构建无向带权图网络

此后,根据题意对输入数据进行处理:

    int i,j,k,l; // j,k,l分别表示输入的两个城市j、k和这两者之间的距离l
    cin >> N >> M >> C1 >> C2;
    for(int i = 0; i < N; i ++){
        cin >> num_of_team[i];
    }
    for(int i = 0; i < M; i++){
        cin >> j >> k >> l;
        // 无向带权图,则j—>k与k->j应当看作同一条路径,即二者作为端点均需要相互连接
        v[j].push_back(k);
        v[k].push_back(j);
        // 距离矩阵中,二者之间的距离是一致的
        distence[j][k] = distence[k][j] = l;
    }

此后,我们定义最短距离矩阵,为每个元素初始化为一个很大的数,表示两两之间并不相通:

    for(int i=0; i<N; i++)mindis[i] = 100000000;

重点来了,现在我们设计dfs函数:选择当前城市,当前走过的路径长度,当前积累的救援队数量作为传入参数,

void dfs(int curcity, int curlen, int curnums)

第一步:剪枝

        根据传入参数,我们可以意识到,当当前走过的路径长度curlen大于mindis[curcity],即并非第一次到达curcity且走过的路径长度比之前到达curcity所花费的距离大,直接return,

此后,由于我们的传入参数中并没有目标城市,因此对于当前城市,我们需要先对其进行判断:

                if 是目标城市:

                        当前所走过的路径curlen是否小于该城市之前的所记录的最短距离mindis[city]:

                                if 距离相等:

                                        说明是满足要求的最短路径之一,path自增1

                                        同时比较当前积累的救援队数量curnums和最大救援队数量teams是否需要交换

                      

                                elif 当前走过的路径curlen小于该城市之前的所记录的最短距离mindis[city]:

                                        表示之前所有的路径均非最短路径,此时将重新对最短路径数组mindis[C2],路径数path,最大救援队数量teams重新赋值,

                elif 非目标城市:

                        此时运用一点贪心的思想,比较当前走过的路程curlen与当前城市记录到的最短路径值,

                                if  curlen < mindis[curcity]:  

                                        表示以前走过的到达本城市的路径均非最短路径,直接对其重新赋值为当前路径长度

                               for  对于所有与当前城市接壤的所有城市v[curcity]进行遍历,         

                                        将其中的所有城市与当前城市相结合,即在当前城市的基础上, 继续DFS,直到路径到达终点或者遍历结束

本部分较为繁琐, DFS的代码思路如上, 接下来是本部分的代码:

   if(curcity == C2){  // if 是目标城市:

        // 当前所走过的路径curlen是否小于该城市之前的所记录的最短距离mindis[city]:

        // if 距离相等:
        if(curlen == mindis[curcity]){
            path ++;
            if(curnums > teams){
                teams = curnums;
            }
        }

        // elif 当前所走过的路径curlen小于该城市之前的所记录的最短距离mindis[city]:
        else{
            mindis[C2] = curlen;
            path = 1;
            teams = curnums;
        }
    }

    // elif 非目标城市:
    else{
        if(curlen < mindis[curcity])mindis[curcity] = curlen;
        for(int i = 0;i < v[curcity].size(); i++){
            // 在当前城市的基础上, 继续DFS,直到路径到达终点或者遍历结束
            int j = v[curcity][i];
            dfs(j, curlen+distence[curcity][j], curnums+num_of_team[j]);
        }
    }

完整的代码如下:

#include<bits/stdc++.h>
using namespace std;
int N, M, C1, C2;
int path, teams;
int num_of_team[500] = {0};
int distence[500][500];
int mindis[500];
vector<int> v[500];

void dfs(int curcity, int curlen, int curnums){
    if(curlen > mindis[curcity])return;
    if(curcity == C2){
        if(curlen == mindis[curcity]){
            path ++;
            if(curnums > teams){
                teams = curnums;
            }
        }
        else{
            mindis[C2] = curlen;
            path = 1;
            teams = curnums;
        }
    }
    else{
        if(curlen < mindis[curcity])mindis[curcity] = curlen;
        for(int i = 0;i < v[curcity].size(); i++){
            int j = v[curcity][i];
            dfs(j, curlen+distence[curcity][j], curnums+num_of_team[j]);
        }
    }
}


int main(){
    int i,j,k,l;
    cin >> N >> M >> C1 >> C2;
    for(int i = 0; i < N; i ++){
        cin >> num_of_team[i];
    }
    for(int i = 0; i < M; i++){
        cin >> j >> k >> l;
        v[j].push_back(k);
        v[k].push_back(j);
        distence[j][k] = distence[k][j] = l;
    }
    for(int i=0; i<N; i++)mindis[i] = 100000000;
    dfs(C1, 0, num_of_team[C1]);
    cout << path<< " " << teams;
}

   以上就是使用C++解决本题的全部内容,最后附上AK截图:

        本题难度较大,思路尚未清晰的童鞋也不要气馁, 可以针对这部分内容多看看讲解或者是找一些简单题来练手, DFS题目重难点都在于DFS内容的设计,这部分没有固定的公式可以套用,但是只要思路清晰,虽然不能拿到全部的用例分,我相信大部分的分数还是可以拿到手的.

        针对本题,C++部分的做法较为简单直接和常规,如果您有疑惑或者是更好的见解,请在评论区留言交流!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1419153.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

JMeter性能测试实战

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

喝酒筛子小游戏集合源码微信小程序喝酒骰子程序带流量主版本源码酒桌玩筛子源码

2023新版酒桌小游戏喝酒小程序源码-&#xff08;流量主版本&#xff09; 修改增加了广告位 根据文档直接替换&#xff0c;原版本没有广告位 直接上传源码到开发者端即可 通过后改广告代码&#xff0c;然后关闭广告展示提交&#xff0c;通过后打开即可 无广告引流 流量主版…

Spring MVC 基本知识

知识回顾 Tomcat 是 Servlet 容器&#xff0c;会解析 Java Web 应用下的 WEB-INF/web.xml 文件&#xff0c;得到相关的 Servlet 组件。 原理解析 Spring MVC 实际是定义了一个 DispatcherSevlet 来统一管理当前 Web 应用下的 Path 路径。在 DispatchSevlet 中持有了一个 Spr…

存储技术架构演进

一. 演进过程 存储技术架构的演进主要是从集中式到分布式的一种呈现&#xff0c;集中式存储模式凭借其在稳定性和可靠性方面的优势成为许多业务数据库的数据存储首选&#xff0c;顾名思义&#xff0c;集中式存储主要体现在集中性&#xff0c;一套集中式管理的存储系统&#xff…

鸿蒙开发-UI-布局-网格

鸿蒙开发-UI-布局 鸿蒙开发-UI-布局-线性布局 鸿蒙开发-UI-布局-层叠布局 鸿蒙开发-UI-布局-弹性布局 鸿蒙开发-UI-布局-相对布局 鸿蒙开发-UI-布局-格栅布局 鸿蒙开发-UI-布局-列表 文章目录 前言 一、基本概念 二、开发布局 1.排列方式 2.设置行列间距 三、应用特性 1.网格数…

数字图像处理(实践篇)三十五 OpenCV-Python在图像上进行SQRBox滤波操作实践

目录 一 方框滤波 二 涉及的函数 三 实践 一 方框滤波 方框滤波是均值滤波的一般形式。二者的不同之处在于在均值滤波中,将滤波器中所有的像素值求和后的平均值作为滤波后结果,方框滤波也是求滤波器内所有像素值的之和࿰

AGP更改gradle版本无效的解决方案

从Github下载了一个项目&#xff0c;非常激进&#xff0c;AGP版本8.4.0&#xff0c;而我的AS只支持到8.2.0 详见&#xff1a;https://developer.android.com/build/releases/gradle-plugin?buildsystemndk-build&hlzh-cn#android_gradle_plugin_and_android_studio_compa…

国标GB/T 28181详解:GB/T28181基本注册流程和注销流程

目 录 一、基本要求 二、注册流程 三、注销流程 四、产品说明 五、参考 一、基本要求 根据《GB/T 28181-2022》第9章关于注册和注销的描述&#xff0c;GB28181的注册和注销应满足下面这些要求&#xff1a; SIP 客户端网关、SIP 设备、联网系统等 SIP 代理…

Python中如何将字符串变成数字?

字符串和数字是Python中常见的数据类型&#xff0c;而且在撰写Python程序的时候&#xff0c;也经常会遇到需要将字符串转换为数字的情况&#xff0c;那么Python中如何将字符串变成数字?有多种方法可以使用&#xff0c;接下来一起来看看具体内容介绍。 1、使用int()函数 int(…

C++(6) 继承

文章目录 继承1. 继承1.1 什么是继承1.2 C 继承方式1.2.1 基本案例1.2.2 继承权限组合1.2.3 继承中构造函数的说法1.2.4 继承中析构函数的执行顺序1.2.5 继承中变量名称冲突问题1.2.6 继承中函数【重写】 继承 1. 继承 1.1 什么是继承 面向对象程序设计中最重要的一个概念是继…

STM32-电动车报警器

STM32-电动车报警器 1.振动传感器点亮LED灯 需求:当振动传感器接收到振动信号时&#xff0c;使用中断方式点亮LED1 //重写中断服务函数&#xff0c;如果检测到EXTI中断请求&#xff0c;则进入此函数 void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {//一根中断线上接有多个…

基于springboot网上图书商城源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括网上图书商城的网络应用&#xff0c;在外国网上图书商城已经是很普遍的方式&#xff0c;不过国内的管理网站可能还处于起步阶段。网上图书商城具有网上图书信息管理功能的选择…

求两数之间的最大公约数和最小公倍数

1. 最大公约数和最小公倍数的概念 最大公约数&#xff1a;最大公因数&#xff0c;也称最大公约数、最大公因子&#xff0c;指两个或多个整数共有约数中最大的一个。a&#xff0c;b的最大公约数记为&#xff08;a&#xff0c;b&#xff09;&#xff0c;同样的&#xff0c;a&…

标准库中的string类(下)——“C++”

各位CSDN的uu们你们好呀&#xff0c;这段时间小雅兰的内容仍然是Cstring类的使用的内容&#xff0c;下面&#xff0c;让我们进入string类的世界吧&#xff01;&#xff01;&#xff01; string类的常用接口说明 string - C Reference string类的常用接口说明 string类对象的修…

C++ 数论相关题目 扩展欧几里得算法(裴蜀定理)

给定 n 对正整数 ai,bi &#xff0c;对于每对数&#xff0c;求出一组 xi,yi &#xff0c;使其满足 aixibiyigcd(ai,bi) 。 输入格式 第一行包含整数 n 。 接下来 n 行&#xff0c;每行包含两个整数 ai,bi 。 输出格式 输出共 n 行&#xff0c;对于每组 ai,bi &#xff0c;求…

SpringCloud--OpenFeign解析

一、OpenFeign简介 OpenFeign是一个声明式的Web服务客户端&#xff0c;它简化了与HTTP API的通信。它的底层原理主要基于Java的反射和动态代理&#xff0c;并且通过利用Spring AOP 框架、RestTemplate、Ribbon 和 Hystrix 等组件&#xff0c;将复杂的 HTTP 调用封装起来&#…

浏览器V8是怎么进行垃圾回收的

面试相关问题解答 1、浏览器V8是怎么进行垃圾回收的 浏览器的内存占用是有限制的&#xff1a; 64位系统&#xff1a;物理内存 > 16G > 最大堆内存限制为4G物理内存 < 16G > 最大堆内存限制为2G 32位系统&#xff1a;最大堆内存限制为1G为什么浏览器要对占用内…

云表企业级无代码案例-10天做出《运输车辆管理系统》

物流运输行业像物流公司、运输车队、出租客运公司等企业在车辆管理方面&#xff0c;因其行业特点而面临很多管理上难题&#xff1a; 一、管理的对象多&#xff1a;车辆多&#xff0c;如果有三方车辆挂靠&#xff0c;还要涉及到车主管理&#xff0c;关系错综复杂。 二、管理的信…

2024-01-24-redis4

秒杀活动 需求&#xff1a;库存中有10件商品 商品的信息自定义 同时有100个人去抢购&#xff08;这里100个人的抢购由jmeter来模拟&#xff09; jmeter的使用 在idea中将后台代码实现 package org.aaa.controller;import org.apache.commons.lang3.StringUtils; import org.sp…

LabVIEW机械臂轨迹跟踪控制

介绍了一个使用LabVIEW开发的机械臂轨迹跟踪控制系统。该系统的主要目标是实现对机械臂运动轨迹的精确控制&#xff0c;使其能够按照预定路径进行精确移动。此系统特别适用于需要高精度位置控制的场合&#xff0c;如自动化装配、精密操作等。 为了实现LabVIEW环境下的机械臂轨迹…