【ccf-csp题解】第四次csp认证-第四题-网络延时-树的直径

news/2024/10/17 13:28:14/

题目描述

思路分析

本题所求的实际上是树的直径,即树中的任意两个结点之间的最大距离

采用的方法是dfs

从根节点开始遍历,对于每一个被dfs的结点m,返回此结点m到所有叶子结点的距离最大的那个即d1,同时在dfs过程当中记录结点m到所有叶子结点的距离第二大的那个,即d2

那么最终答案就是对于每一个结点取res=res(res,d1+d2)

举个栗子:

设最下面的1--4的编号分别为5,6,7,8

从1开始dfs,首先进入2,然后对2dfs,进入3,然后对3进行dfs,对3dfs的时候,又进入5,对5dfs,此时由于结点5没有分支,所以这一次dfs得到d1=d2=0,返回给结点3的值为d1+1=1,之后3也算dfs完毕,结果:d1=1,d2=0,返回给2的值为d1+1=2,然后开始对4dfs,此时会进入下一层,依次对6,7,8进行dfs均返回d1+1=1,所以对于4dfs的结果是d1=1,d2=1,返回给2的值为2,所以最终2dfs结果是d1=2,d2=2,此时得到ans最大值:d1+d2=4.返回给结点1的值为d1+1=3,所以对1dfs完毕得到的结果是d1=3,d2=0,最终返回的结果为d1+1=4,同时保留答案ans=4

最后再提示一下,虽然树的本质是无向图,但是在建立边的时候,直接建成从上往下指的有向边即可,因为dfs的时候是从上往下的。当然建立成无向边也可以,只不过需要一个bool数组标记已经遍历过的结点,防止进入无限循环。

满分代码

#include<iostream>
#include<cstring>
using namespace std;
const int N=20010;
int e[N],ne[N],h[N],idx;
int n,m;
int ans;
void add(int a,int b)
{e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
int dfs(int u)
{int d1=0,d2=0;for(int i=h[u];i!=-1;i=ne[i]){int j=e[i];int d=dfs(j);if(d>=d1)d2=d1,d1=d;else if(d>=d2)d2=d;}ans=max(ans,d1+d2);return d1+1;
}
int main()
{scanf("%d%d",&n,&m);memset(h,-1,sizeof h);for(int i=2;i<=n+m;i++){int x;scanf("%d",&x);add(x,i);}dfs(1);cout<<ans;return 0;
}


http://www.ppmy.cn/news/1103859.html

相关文章

LeetCode:长度最小的子数组

题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续子数组 [numsl, numsl1, …, numsr-1, numsr] &#xff0c;并返回其长度。如果不存在符合条件的子数组&#xff0c;返回 0 。 示例 1&#xff1a; 输入&…

java基础面试题第二天

1.java基础面试题第三天 1.数组到底是不是对象 是对象。 先说说对象的概念。对象是根据某个类创建出来的一个实例&#xff0c;表示某类事物中一个具体的个体。数组类的父类就是Object类&#xff0c;那么可以推断出数组就是对象。 2.java的基本数据类型有哪些&#xff1f; b…

android framework之Applicataion启动流程分析(四)

本文主要学习并了解Application的Activity启动流程。 这边先分析一下Launcher是如何启动进程的Acitivity流程。从Launcher启动Acitivity的时候&#xff0c;它是把启动任务丢给instrumentation模块去协助完成&#xff0c;由它进一步调用AMS的startActivity()方法 去启动&#xf…

0基础学习VR全景平台篇 第97篇:VR步进式漫游

蛙色VR步进式漫游正式上线&#xff01; 为全行业室内场景提供三维空间重建能力&#xff0c;基于真实场景复刻&#xff0c;多维展示打破线下时空限制&#xff0c;提供高性价比的VR空间应用解决方案。 一、什么是步进式漫游&#xff1f; VR步进式漫游&#xff0c;基于AI特征点提…

【C++基础】实现日期类

​&#x1f47b;内容专栏&#xff1a; C/C编程 &#x1f428;本文概括&#xff1a; C实现日期类。 &#x1f43c;本文作者&#xff1a; 阿四啊 &#x1f438;发布时间&#xff1a;2023.9.7 对于类的成员函数的声明和定义&#xff0c;我们在类和对象上讲到过&#xff0c;需要进行…

Golang RabbitMQ实现的延时队列

文章目录 前言一、延时队列与应用场景二、RabbitMQ如何实现延时队列实现延时队列的基本要素整体的实现原理如下 三、Go语言实战生产者消费者 前言 之前做秒杀商城项目的时候使用到了延时队列来解决订单超时问题&#xff0c;本博客就总结一下Golang是如何利用RabbitMQ实现的延时…

2.12 PE结构:实现PE字节注入

本章笔者将介绍一种通过Metasploit生成ShellCode并将其注入到特定PE文件内的Shell注入技术。该技术能够劫持原始PE文件的入口地址&#xff0c;在PE程序运行之前执行ShellCode反弹&#xff0c;执行后挂入后台并继续运行原始程序&#xff0c;实现了一种隐蔽的Shell访问。而我把这…

51单片机的智能台灯控制系统仿真( proteus仿真+程序+原理图+报告+讲解视频)

51单片机的红外光敏检测智能台灯控制系统仿真 1.主要功能&#xff1a;2.仿真3. 程序代码4. 原理图5. 设计报告6. 设计资料内容清单&&下载链接 51单片机的红外光敏检测智能台灯控制系统仿真( proteus仿真程序原理图报告讲解视频&#xff09; 仿真图proteus7.8及以上 程…