树的直径
做一只大熊猫
让优秀成为一种习惯!
展开
-
2021-11-04
题意 给我们一颗 n 个节点之间的树,要求我们在这棵树上选择 2 个不同的节点,使其他节点到这 2 个节点中的一个的距离尽可能的小,输出所有点的最小最大值。 思路 我们在树的直径上二分二分一个距离。在直径上找到两个对称点,这两个对称点到对应的叶子节点的距离为我们二分的距离:md。 然后对这两个对称点出发,暴力跑深度为 md 的距离,并标记走过的点,最后判读所有的点是否都被标记。 代码 #include <bits/stdc++.h> using namespace std; const原创 2021-11-04 10:17:11 · 91 阅读 · 0 评论 -
F - Park Visit HDU - 4607(树的直径)
题意 给我们一棵 n 个节点带边权为 1 的树,问访问 x 个节点需要走的边树总和,可以从任意一个节点出发,访问 x 节点。 思路 设树的直径为长为 len, 如果当访问的节点数 x <= len + 1, (len + 1 为直径上的点数)的时候只需要走直径就行了,此时答案为 x - 1. 否则的话,如果路径走完了还,走的节点数量还不够,只能走其他不在树的直径上的节点的,对一个节点对答案的贡献为,而走树的直径上的点对答案的贡献为 1,那么答案为 (x - (len+1)) * 2 + le原创 2021-03-06 21:28:32 · 112 阅读 · 0 评论 -
E - Cow Marathon POJ - 1985(树的直径模板题)
代码 #include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <algorithm> #include <string> #include <queue> #include <map> #include <bitset> #include <vector> using nam原创 2021-03-06 21:16:02 · 95 阅读 · 0 评论 -
D - Anton and Tree CodeForces - 734E(dfs 缩点+树的直径)
题意 给我一颗有 n 个节点的树,树的编号从 1~n 开始,树的节点有点权,值为 0 的表示节点被染成了 白色,权值为的时候被染成了黑色, 现在我们的给我们提供一种操作(如下图):选择某一个结点 x,让把所有把 x 能直接有路径到达的点设这些点为 y,且 y 与 x 同色,把 x 与所有 y 的颜色进行翻转。 思路 把相邻且颜色相同的点认为是在一个连通分量里面,这个时候如果我们选择一个连通分量对其进行翻转,那么翻转之后这个连通分量与周围的连通分量的颜色变的相同,相当于同化了周围的连通分量,接下来我们原创 2021-03-06 21:14:27 · 119 阅读 · 0 评论 -
C - Two POJ - 1849(树的直径)
题意 给我一颗 n 个节点带边权的树,编号从 1~n,现在两个人从结点 s 分别出发把所有的结点走一遍,走到终点时候停止不在走了,问这两个人把所有的点访问一遍走的最短距离和是多少。 思路 如果两个人走到终点后,有回到起点 s 的话路程和为所有边权和的 2 倍,设为 sum,即每条边都被访问 2 次 如果不回到启点的话,我们考虑这种情况下,有些边只会被走一遍,可以想到如果只被访问一遍的边权的权值之和尽可能的大的话设这个是为 x,那么答案就是 sum - x, 而 x 就是树的直径。 代码 #inclu2021-03-06 20:53:25 · 81 阅读 · 0 评论 -
1577:【例 3】数字转换(求树的直径——两遍dfs找树的直径的端的/树形DP求解)
1577:【例 3】数字转换 问题描述 如果一个数 x 的约数和 y (不包括他本身)比他本身小,那么 x 可以变成 y,y 也可以变成 x。例如 4 可以变为 3,1 可以变为 7。限定所有数字变换在不超过 n 的正整数范围内进行,求不断进行数字变换且不出现重复数字的最多变换步数。 思路 题意:x所有约数的和为y,那么x就可以和y互相转化(在x<y的前提下),首先我们预处理1~n中的每个数字x,可以转化为那个数y,我们在x与y之间建立一条边,这样预处理完之后,形成以1为根节点的一颗树, 题目就.原创 2020-10-11 10:56:41 · 703 阅读 · 3 评论