题目: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 题解相关推荐

  1. [八省联考 2018] 林克卡特树 题解

    这道题我前前后后做了一年,共过了 4 4 4 遍,每次都有的新的理解:这次我认为自己理解透了,于是就写了一篇题解. 这道题是我入坑看到的第一道黑题(当时很萌,不知道黑题是什么,看到这题感觉很好玩),另 ...

  2. [JS][dfs]题解 | #迷宫问题#

    题解 | #迷宫问题# 题目链接 迷宫问题 题目描述 定义一个二维数组 N*M ,如 5 × 5 数组下所示: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 1, 1 ...

  3. [JS][dp]题解 | #打家劫舍(一)#

    题解 | #打家劫舍(一)# 题目链接 打家劫舍(一) 题目描述 描述 你是一个经验丰富的小偷,准备偷沿街的一排房间,每个房间都存有一定的现金,为了防止被发现,你不能偷相邻的两家,即,如果偷了第一家, ...

  4. [JS]题解 | #魔法数字#

    题解 | #魔法数字# 题目链接 魔法数字 题目描述 牛妹给牛牛写了一个数字n,然后又给自己写了一个数字m,她希望牛牛能执行最少的操作将他的数字转化成自己的. 操作共有三种,如下: 在当前数字的基础上 ...

  5. [JS]题解 | #岛屿数量#

    题解 | #岛屿数量# 题目链接 岛屿数量 题目描述 时间限制:1秒 空间限制:256M 描述 给一个01矩阵,1代表是陆地,0代表海洋, 如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右 ...

  6. [JS] 题解:提取不重复的整数

    题解:提取不重复的整数 https://www.nowcoder.com/practice/253986e66d114d378ae8de2e6c4577c1 时间限制:1秒 空间限制:32M 描述 输 ...

  7. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

  8. [洛谷1383]高级打字机 题解

    题解 这道题一看就珂以用主席树啊 这是一道神奇的题目,那么我们先敲一个主席树,然后维护一个数组len,表示下一次应该在len + 1插入, 之后对于T操作,在上一个版本的len + 1上直接执行插入 ...

  9. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  10. 【题解搬运】PAT_L1-009 N个数求和

    从我原来的博客上搬运.原先blog作废. (伪)水题+1,旨在继续摸清这个blog(囧 题目 就是求N个数字的和.麻烦的是,这些数字是以有理数"分子/分母"的形式给出的,你输出的和 ...

最新文章

  1. linux学习之VNC远程控制(一)
  2. 语言模型GPT跨界CV,OpenAI揭示强算力Transformer具有通用性
  3. CentOS安装网络代理软件
  4. 第九周项目实践3 利用二叉树遍历思想解决问题
  5. 云炬60s看世界20211125
  6. OpenGL parallax mapping视差映射的实例
  7. 配置 aws cli_AWS CLI教程–如何安装,配置和使用AWS CLI了解您的资源环境
  8. js原生后代选择器_CSS 后代选择器
  9. CTF基本赛制与题型
  10. Hadoop源代码分析(MapReduce概论)
  11. java面试要点---ibatiS框架的使用方法介绍---随时更新
  12. 【传】玩转Android---UI篇---ImageButton(带图标的按钮)
  13. nuxt项目dist上传服务器,nuxt.js构建的项目,打包后如何部署到服务器?
  14. u-boot-2012-07 for tiny210, 支持USB DNW, 支持YAFFS2烧写, 彻底抛弃superboot
  15. stata14中文乱码问题
  16. 《Redis视频教程》(p5)
  17. 好货推荐!两款免费的 Linux 桌面录制工具
  18. C# ToolStrip 图标大小设置
  19. mac无法验证您网络上的打印机,怎么解决?
  20. cmos电路多余输入端能否悬空_CMOS电路不使用的输入端不能悬空,会造成逻辑混乱。 这是为什么?...

热门文章

  1. JMH基准测试,看我怎么用它来测试mongodb的数据加载性能
  2. CKA-kubernetes 部署-hard-way-1.1-1.3
  3. Word基础(三十二)脚注与尾注
  4. 新手建站必看,怎么选择主机空间?
  5. 网上商城的功能模块架构设计之(一)
  6. chrome真机调试ios
  7. 网易公开课 “可汗学院”《统计学》学习笔记
  8. 《Linux管理与应用》课程考核方案
  9. UVM寄存器模型:reg adapter实现和集成
  10. 重装系统后如何恢复mysql服务