CF120F Spiders 题解
题目:CF120F Spiders
DP - 树形DP - 树的直径 - 图论 - 树 - bfs
题目大意
给出 nnn 棵树,你每次可以选择两个树,并将这两棵树的两个节点粘起来,形成一棵新的树。经过 n−1n-1n−1 次操作后,这 nnn 棵树就融合为了一棵树
问最后这棵树的最大直径(最长链)长度
解题思路
以前看到有些题是要求直径最短,看到这题之后松了口气
因为最后要求的是最长链,所以,每一棵树都要把自己的最长链(直径)贡献给最终答案
那么我们就把 nnn 棵树的直径粘成一段不就好了吗
换句话说:设第 iii 棵树的直径端点为 ui,viu_i,v_iui,vi,[x,y][x,y][x,y] 表示一个将点 xxx 和点 yyy 粘起来的操作。
那么就:[v1,u2],[v2,u3]…[vn−1,un][v_1,u_2],[v_2,u_3] \dots [v_{n-1},u_n][v1,u2],[v2,u3]…[vn−1,un]
最后的答案就是 nnn 棵树的直径之和了
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
const int Maxn=1010,inf=0x3f3f3f3f;
int dis[Maxn],f[Maxn];
int n,ans;
vector <int> e[Maxn];
inline int read()
{int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return s*w;
}
void dfs(int x,int fa)
{int m1=0,m2=0;for(int i=0;i<e[x].size();++i){int y=e[x][i];if(y==fa)continue;dfs(y,x);f[x]=max(f[x],f[y]+1);int tmp=f[y]+1;if(tmp>m1)m2=m1,m1=tmp;else if(tmp>m2)m2=tmp;}dis[x]=max(m1+m2,max(m1,m2));
}
int main()
{freopen("input.txt","r",stdin); // 注意这题提交的时候要带文件输入输出freopen("output.txt","w",stdout);int T=read();while(T--){n=read();int tot=0;for(int i=1;i<n;++i){int x=read(),y=read();e[x].push_back(y);e[y].push_back(x);}dfs(1,0);for(int i=1;i<=n;++i)tot=max(tot,dis[i]);ans+=tot;for(int i=1;i<=n;++i){e[i].clear();dis[i]=f[i]=0;}}printf("%d\n",ans);return 0;
}
CF120F Spiders 题解相关推荐
- [八省联考 2018] 林克卡特树 题解
这道题我前前后后做了一年,共过了 4 4 4 遍,每次都有的新的理解:这次我认为自己理解透了,于是就写了一篇题解. 这道题是我入坑看到的第一道黑题(当时很萌,不知道黑题是什么,看到这题感觉很好玩),另 ...
- [JS][dfs]题解 | #迷宫问题#
题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...
- [JS][dp]题解 | #打家劫舍(一)#
题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...
- [JS]题解 | #魔法数字#
题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...
- [JS]题解 | #岛屿数量#
题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...
- [JS] 题解:提取不重复的整数
题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- [洛谷1383]高级打字机 题解
题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...
- luogu P1549 棋盘问题(2) 题解
luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...
- 【题解搬运】PAT_L1-009 N个数求和
从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...
最新文章
- linux学习之VNC远程控制(一)
- 语言模型GPT跨界CV,OpenAI揭示强算力Transformer具有通用性
- CentOS安装网络代理软件
- 第九周项目实践3 利用二叉树遍历思想解决问题
- 云炬60s看世界20211125
- OpenGL parallax mapping视差映射的实例
- 配置 aws cli_AWS CLI教程–如何安装,配置和使用AWS CLI了解您的资源环境
- js原生后代选择器_CSS 后代选择器
- CTF基本赛制与题型
- Hadoop源代码分析(MapReduce概论)
- java面试要点---ibatiS框架的使用方法介绍---随时更新
- 【传】玩转Android---UI篇---ImageButton(带图标的按钮)
- nuxt项目dist上传服务器,nuxt.js构建的项目,打包后如何部署到服务器?
- u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot
- stata14中文乱码问题
- 《Redis视频教程》(p5)
- 好货推荐!两款免费的 Linux 桌面录制工具
- C# ToolStrip 图标大小设置
- mac无法验证您网络上的打印机,怎么解决?
- cmos电路多余输入端能否悬空_CMOS电路不使用的输入端不能悬空,会造成逻辑混乱。 这是为什么?...