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

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++部分的做法较为简单直接和常规,如果您有疑惑或者是更好的见解,请在评论区留言交流!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL解决 恢复从备份点到灾难点之间数据恢复

CSDN 成就一亿技术人&#xff01; 今天分享一期 mysql中 备份之后发生灾难造成数据丢失 那么如何恢复中间的数据呢&#xff1f; 数据库数据高于一切&#xff08;任何数据是不能丢失的&#xff09; CSDN 成就一亿技术人&#xff01; 目录 1.准备测试数据库 2.备份数据库 观…

Visual Studio 2022 C++ 生成dll或so文件在windows或linux下用C#调用

背景 开发中我们基本使用windows系统比较快捷&#xff0c;但是部署的时候我们又希望使用linux比较便宜&#xff0c;硬件产商还仅提供了c sdk&#xff01;苦了我们做二次开发的码农。 方案 需要确认一件事&#xff0c;目前c这门语言不是跨平台的 第一个问题【C生成dll在window…

C语言——深入理解指针1

目录 1. 内存和地址1.1 内存 2. 指针变量和地址2.1 取地址操作符2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 如何拆解指针变量2.2.3 解引用操作符 2.3 指针的大小 3. 指针变量类型的意义3.1 指针的解引用3.2 指针 - 整数3.3 void*指针 4. const…

TypeScript 学习笔记(Day2)

「写在前面」 本文为 b 站黑马程序员 TypeScript 教程的学习笔记。本着自己学习、分享他人的态度&#xff0c;分享学习笔记&#xff0c;希望能对大家有所帮助。推荐先按顺序阅读往期内容&#xff1a; 1. TypeScript 学习笔记&#xff08;Day1&#xff09; 目录 3 TypeScript 常…

百度输入法往选字框里强塞广告

关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 国内几乎100%的输入法都有广告&#xff0c;只是你们没发现而已&#xff01;&#xff01;&#xff01; 百度输入法居然在输入法键盘上推送广告&#xff0c;近日&#xff0c;博主阑夕 表示&#xff0c;V2EX论坛上有…

【webrtc】‘ninja.exe‘ 不是内部或外部命令,也不是可运行的程序及vs2019 重新构建m98

werbtc 就是用ninja.exe 来构建找到了自己以前构建的webrtc 原版 m98 【m98 】webrtc ninja 构建 、example、tests 及OWT- P2P 项目P2PMFC-E2E-m98G:\CDN\rtcCli\webrtc-checkout\src找到了自己的deptools的路径 deptools里确实没有ninja.exe D:\SOFT\depot_tools\third_party…

【LeetCode每日一题】56. 合并区间插入区间

一、判断区间是否重叠 力扣 252. 会议室 给定一个会议时间安排的数组 intervals &#xff0c;每个会议时间都会包括开始和结束的时间 intervals[i] [starti, endi] &#xff0c;请你判断一个人是否能够参加这里面的全部会议。 思路分析 因为一个人在同一时刻只能参加一个会…

《HTML 简易速速上手小册》第7章:HTML 多媒体与嵌入内容(2024 最新版)

文章目录 7.1 在HTML中嵌入视频和音频7.1.1 基础知识7.1.2 案例 1&#xff1a;嵌入视频文件7.1.3 案例 2&#xff1a;嵌入音频文件7.1.4 案例 3&#xff1a;创建一个视频和音频混合的播放列表 7.2 使用 <iframe> 嵌入外部内容7.2.1 基础知识7.2.2 案例 1&#xff1a;嵌入…

基于数字签名技术的挑战/响应式认证方式

挑战/响应式认证方式简便灵活&#xff0c;实现起来也比较容易。当网络需要验证用户身份时&#xff0c;客户端向服务器提出登录请求&#xff1b;当服务器接收到客户端的验证请求时&#xff0c;服务器端向客户端发送一个随机数&#xff0c;这就是这种认证方式的“冲击&#xff08…

ArcGIS Pro如何新建字段

无论是地图制作还是数据分析&#xff0c;字段的操作是必不可少的&#xff0c;在某些时候现有的字段不能满足需求还需要新建字段&#xff0c;这里为大家讲解一下在ArcGIS Pro中怎么新建字段&#xff0c;希望能对你有所帮助。 数据来源 教程所使用的数据是从水经微图中下载的水…

响应式商业服务专利版权申请 公司网站模板源码系统 带完整的搭建教程

随着互联网的普及和发展&#xff0c;企业对于建立专业、高效的网站的需求日益增长。为了满足这一市场需求&#xff0c;罗峰给大家分享一款响应式商业服务专利版权申请公司网站模板源码系统。该系统不仅功能强大&#xff0c;而且易于搭建和定制&#xff0c;极大地降低了企业建立…

单片机学习笔记---定时器计数器(含寄存器)工作原理介绍(详解篇2)

目录 T1工作在方式2时 T0工作在方式3时 四种工作方式的总结 定时计数器对输入信号的要求 定时计数器对的编程的一个要求 关于初值计算的问题 4种工作方式的最大定时时间的大小 关于编程方式的问题 实例分析 实例1 实例2 T1工作在方式2时 51单片机&#xff0c;有两个…

python3.8 安装缺少ssl、_ctypes模块解决办法

问题 安装pyhton3.8安装默认不依赖ssl 运行Flask项目时报错&#xff1a; Traceback (most recent call last):File "/usr/local/python3/bin/flask", line 8, in <module>sys.exit(main())File "/usr/local/python3/lib/python3.8/site-packages/flask…

C语言递归篇章+系统讲解分析+深入理解递归+根源进行讲解+进制转换+操作环境+实例剖析+万字+百张图片精细化讲解

递归的讲解系统分析 什么是递归 本质上就是一种算法 最简单递归 栈溢出 没有限制条件 导致无穷尽的调用自己 从而溢出 最后变成死递归 _________________________________________________________________________________________________________________________________…

SAP MM 采购发票输入税额,模拟时候发现没有税科目记账税额!

原因&#xff1a;行项目税额和抬头不一样导致&#xff0c;以下是调整过的截图&#xff0c;原来底下是J2

去中心化世界的奇迹:深度解析Web3

随着科技的飞速发展&#xff0c;我们正逐渐进入一个新的数字时代&#xff0c;而Web3技术正是这个时代的奇迹之一。本文将深入解析Web3&#xff0c;揭示它在构建去中心化世界方面的深远影响以及给我们带来的可能性。 什么是Web3&#xff1f; Web3是互联网的第三个时代&#xff…

低代码数字孪生平台

老子云平台 老子云平台专注于3D资源服务与应用在Web页面上的极致展示&#xff08;渲染与交互&#xff09; 老子云平台架构 核心优势-AMRT标准格式 2022年6月&#xff0c;在国家科技部科技成果鉴定中心的成果评定中&#xff0c;AMRT标准被评为国际先进成果&#xff0c;AMRT格式…

TCP常用端口号

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom 思科认证\CCNA\CCNP\CCIE Linux\RHCE\…

Git安装,Git镜像,Git已安装但无法使用解决经验

git下载地址&#xff1a; Git - 下载 (git-scm.com) <-git官方资源 Git for Windows (github.com) <-github资源 CNPM Binaries Mirror (npmmirror.com) <-阿里镜像&#xff08;推荐&#xff0c;镜…

shell脚本——函数与数组

目录 一、函数 1、什么是函数&#xff1f; 2、函数的定义与调用 2.1 函数的格式 2.2 函数的调用方法 3 、查看与删除函数 3.1 查看函数 3.2 删除函数 4、函数的返回值 5、函数的传参数 6、函数的作用范围 7、函数的递归 二、数组 1、什么是数组&#xff1f; 2、数…