龙龙送外卖pta[代码+讲解]

题目

题解 

代码

题目

龙龙是“饱了呀”外卖软件的注册骑手,负责送帕特小区的外卖。帕特小区的构造非常特别,都是双向道路且没有构成环 —— 你可以简单地认为小区的路构成了一棵树,根结点是外卖站,树上的结点就是要送餐的地址。

每到中午 12 点,帕特小区就进入了点餐高峰。一开始,只有一两个地方点外卖,龙龙简单就送好了;但随着大数据的分析,龙龙被派了更多的单子,也就送得越来越累……

看着一大堆订单,龙龙想知道,从外卖站出发,访问所有点了外卖的地方至少一次(这样才能把外卖送到)所需的最短路程的距离到底是多少?每次新增一个点外卖的地址,他就想估算一遍整体工作量,这样他就可以搞明白新增一个地址给他带来了多少负担。

输入格式:

输入第一行是两个数 N 和 M (2≤N≤10^5, 1≤M≤10^5),分别对应树上节点的个数(包括外卖站),以及新增的送餐地址的个数。

接下来首先是一行 N 个数,第 i 个数表示第 i 个点的双亲节点的编号。节点编号从 1 到 N,外卖站的双亲编号定义为 −1。

接下来有 M 行,每行给出一个新增的送餐地点的编号 Xi​。保证送餐地点中不会有外卖站,但地点有可能会重复。

为了方便计算,我们可以假设龙龙一开始一个地址的外卖都不用送,两个相邻的地点之间的路径长度统一设为 1,且从外卖站出发可以访问到所有地点。

注意:所有送餐地址可以按任意顺序访问,且完成送餐后无需返回外卖站

输出格式:

对于每个新增的地点,在一行内输出题目需要求的最短路程的距离。

输入样例:

7 4
-1 1 1 1 2 2 3
5
6
2
4

输出样例:

2
4
4
6

题解 

题意:给出N个节点,第 i 个表示第 i 个点的双亲节点的编号。初始没有外卖点,新增之后求送完这些外卖的最短路径是多少?【从外卖站出发,最后一次不需要回到外卖站】

假设龙龙一开始(初始状态)一个地址的外卖都不用送。

第一次送到5号,从1->2->5,由于送完不需要回到外卖点,所以路径是2.

第二次外卖送到6号(上次的5号也需要送到,但是送餐地址可以按任意顺序访问),可以从1->2->5->2->6;因此最短路径是4;

第三次外卖送到2号,由于2号之前的走过的路径已经经过,所以按之前的路径还是可以送到。最短路径4

第四次外卖送到4号,可以走1->4->1->2->5->2->6,最短路径是6。

从这里可以观察到,如果新增一个节点, 这个节点已经送过了st[i] = true, 那么对上一次的路径不影响;如果没送过外卖但父节点送过,那就多2(一来一回),如果父节点没送过,那就递推下去。

也可以先假设最后需要回到外卖站,那么总路径就会是所有边数 * 2。 由于最后一次可以不回去,那么最优解就是最后一次走最长的那个分支,然后就不回去了。所以送外卖的最短路径=总路径 (边数 * 2)- 最长的分支。

代码

#include <bits/stdc++.h>
using namespace std;
const int N = 4e5 + 10; 

//e[], ne[], h[],边对应的节点e[],下一个节点 ne[], 头结点h[] 
//d[], f[],节点为 i 的深度d[i], 双亲 f[i]   
int e[N], ne[N], h[N], d[N], f[N], idx;
int start;//根节点 
bool st[N];//标记是否访问过 
void add(int a, int b){
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

//标记每个节点的深度 
void dfs(int u){
    for(int i = h[u]; ~i; i = ne[i]){
        int j = e[i];
        if(!d[j] && j != start){
            d[j] = d[u] + 1;
            dfs(j);
        }
    }
}

int main()
{
    int n, m;
    cin >> n >> m;
    memset(h, -1, sizeof h); //初始化头结点为 -1 
    for(int i = 1; i <= n; i++){
    	int x; cin >> x;
        f[i] = x;// 第i个父节点是 x 
        if(x == -1){
            start = i;continue;//根节点 
        }
    	add(i, x); add(x, i); //双向边 
	}
    d[start] = 0;
    dfs(start);
    int res = 0, mx = 0;
	while(m--){
		int x; cin >> x;
		mx = max(mx, d[x]);//记录最长的深度 
		while(~f[x] && !st[x]){ // ~f[x] 等价于 f[x] = -1, 找父节点直到到达根节点或已访问过的节点 
			res += 2; 
			st[x] = true;
			x = f[x];
		}
		cout << res - mx; //总长度 - 最长边 
        if(m)cout << '\n';
	}
	
    return 0;
}

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

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

相关文章

网工每日一练(2月4日)

试题1 通过HFC网络实现宽带接入&#xff0c;用户端需要的设备是&#xff08;A&#xff09;&#xff0c;局端用于控制和管理用户的设备是&#xff08;D&#xff09;。 &#xff08;1&#xff09;A.Cable Modem B.ADSL Modem C.OLT D.CMTS &#xff08;2&#xff09;A. Cable Mo…

Node.js的安装

目录 1 下载安装包 2 安装 3 以管理员身份打开命令提示符窗口 4 验证Node.js的环境变量 5 配置npm的全局安装路径 6 更换源 1 下载安装包 在浏览器中打开链接&#xff0c;即可看到如下页面&#xff0c;点击即可下载安装包 2 安装 除了下面这一步&#xff0c;其它无脑Nex…

docker安装nacos

nacos v2.3.0 docker run --name nacos -e MODEstandalone -p 8848:8848 -p 9848:9848 -d nacos/nacos-server:2.3.0访问&#xff1a;http://192.168.2.209:8848/nacos

24.云原生ArgoCD高级之钩子

云原生专栏大纲 文章目录 Argo CD钩子如何定义钩子钩子删除策略 Argo CD钩子 Argo CD 是一个用于部署和管理 Kubernetes 应用程序的工具&#xff0c;它提供了一种声明式的方式来定义和自动化应用程序的部署过程。Argo CD 钩子&#xff08;Hooks&#xff09;是一种机制&#x…

TQ15EG开发板教程:开发板Vivado硬件设置

1&#xff0c;串口的配置 PS端有2个串口,在BANK500, 1.8V IO电平 管脚名称 电平 说明 UART0 RX MIO18 1.8V MPSOC方向看 TX MIO19 1.8V UART1 RX MIO21 1.8V TX MIO20 1.8V 2&#xff0c;QSPI的配置 采用2片MT25QU256 拼接成8bit的QSPI存储系统。采用1.8V…

OceanBase 4.2.2 GA 发布,全新特性快速预览!

在 2023 年度发布会上&#xff0c;OceanBase 沿着“一体化”产品战略思路&#xff0c;发布了一体化数据库的首个长期支持版本 4.2.1 LTS。作为 4.0 系列的首个 LTS 版本&#xff0c;该版本的定位是支撑客户关键业务稳定长久运行&#xff0c;我们非常认真的打磨了这个版本&#…

代码随想录刷题第24天

今天正式进入回溯。看了看文章介绍&#xff0c;回溯并不是很高效的算法&#xff0c;本质上是穷举操作。代码形式较为固定。 第一题为组合问题&#xff0c;用树形结构模拟&#xff0c;利用回溯算法三部曲&#xff0c;确定终止条件与单层逻辑&#xff0c;写出如下代码。 不难发现…

【Linux网络编程一】网络基础1(网络框架)

【Linux网络编程一】网络基础1&#xff08;网络框架&#xff09; 一.什么是协议1.通信问题2.协议本质3.网络协议标准 二.协议分层1.为什么协议要分层2.如何具体的分层 三.操作系统OS与网络协议栈的关系1.核心点&#xff1a;网络通信贯穿协议栈 四.局域网中通信的基本原理1.封装…

查看 npm的一些命令,以及npm config set registry x x x 不生效 解决方案

在 Mac 上查看自己的 npm 源&#xff0c;可以使用以下命令&#xff1a; 打开终端应用程序&#xff08;Terminal&#xff09;。 运行以下命令来查看当前的 npm 配置&#xff1a; npm config list这会显示 npm 的配置信息&#xff0c;包括当前使用的源&#xff08;registry&am…

rabbitmq常见问题

1、RabbitMQ如何保证消息不丢失 2、RabbitMQ消息的重复消费问题如何解决 3、RabbitMQ的死信交换机和延迟队列 4、RabbitMQ消息堆积如何解决 5、RabbitMQ的高可用机制

JavaScript鼠标拖放(Drag and Drop)

&#x1f9d1;‍&#x1f393; 个人主页&#xff1a;《爱蹦跶的大A阿》 &#x1f525;当前正在更新专栏&#xff1a;《VUE》 、《JavaScript保姆级教程》、《krpano》、《krpano中文文档》 ​ ​ ✨ 前言 拖放是现代界面不可或缺的交互方式之一。本文将介绍如何用JavaScript…

探索前端开发框架:React、Angular 和 Vue 的对决(一)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

linux找回root密码(CentOS7.6)

首先&#xff0c;启动系统&#xff0c;进入开机界面&#xff0c;在界面中按“e”进入编辑界面。如图 进入编辑界面&#xff0c;使用键盘上的上下键把光标往下移动&#xff0c;找到以““Linux16”开头内容所在的行数”&#xff0c;在行的最后面输入&#xff1a;init/bin/sh。如…

位图布隆过滤器

位图&&布隆过滤器 位图位图的实现位图优缺点关于位图的题目位图的应用 布隆过滤器提出原因布隆过滤器概念操作插入查找删除 bloom优缺点关于bloom的题目实现 哈希切割问题 位图 位图&#xff1a;使用比特位来表示某种状态。比特位为0表示不存在&#xff0c;为1表示存在…

C语言内存函数:memcpy、memcat、memmove介绍和模拟实现(实用性高,建议三连收藏)

目录 1.memcpy函数 1.1函数介绍 1.2函数示范使用 1.3函数的模拟实现 1.4补充 2.memmove函数 2.1函数介绍 2.2函数的使用示范 2.3函数的模拟实现 3.memcmp(内存比较函数&#xff09; 3.1函数介绍 3.2函数的示范使用&#xff0c;有趣的例子 4.函数补充memset(内存…

Visual Studio 最新版安装教程

Visual Studio简介 Visual Studio是一个集成开发环境&#xff08;IDE&#xff09;&#xff0c;广泛应用于.NET和C工作负载以及许多其他语言和框架的开发。它提供了一套完整的工具集&#xff0c;包括UML工具、代码管控工具、集成开发环境&#xff08;IDE&#xff09;等&#xff…

c++重载、隐藏和覆盖

重载 函数名字相同&#xff0c;但参数列表或者返回值不同一组函数要重载必须处在同一作用域中 class Base { public:Base(int data0):m_a(data){}void show(){cout<<"Base::show()"<<endl;}void show(int){cout<<"Base:show(int)"<&l…

Opencv(C++)学习 TBB与OPENMP的加速效果实验与ARM上的实践(二)

在上一篇文章中&#xff0c;我们成功验证了Intel Threading Building Blocks (TBB) 与 OpenMP 在多线程并行处理方面的加速潜力。为了更深入地理解这些技术在实际应用场景中的效能提升&#xff0c;接下来我们将目光转向目标开发板环境&#xff0c;进一步探究这两种框架在嵌入式…

快速排序

思想&#xff1a;分而治之&#xff1b; 确定好基准值然后在两侧递归调用,记好模版就好了 #include<bits/stdc.h> using namespace std; int n; const int N1e610; int q[N]; void quick_sort(int q[],int l,int r) {if(l>r)return ;int xq[l],il-1,jr1;while(i<j…

js数组和字符串之间的转换方式以及数组的一些方法

一、数组和字符串之间的转换方式 1&#xff09;将字符串切割成字符串数组—stringObject.split(separator, howmany) seperator-----字符串、正则表达式&#xff0c;必需 howmany------指定返回的数组的最大长度&#xff0c;可省略&#xff0c;省略后全量返回 源代码 var str&q…