树的直径(两个bfs)】的更多相关文章

题面 Labyrinth Time Limit: 2000MS Memory Limit: 32768K Total Submissions: 4997 Accepted: 1861 Description The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is divided into square blocks, each of them either…
Labyrinth Time Limit: 2000MS   Memory Limit: 32768K Total Submissions: 4062   Accepted: 1529 Description The northern part of the Pyramid contains a very large and complicated labyrinth. The labyrinth is divided into square blocks, each of them eithe…
大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #include <iostream> #include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <…
题目链接 Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Submission(s): 5353    Accepted Submission(s): 1195 Problem Description N planets are connected by M bidirectional channels that allow instant tran…
题意: 给定n个点的带边权树Q个询问. 以下n-1行给出树 以下Q行每行一个数字表示询问. 首先求出dp[N] :dp[i]表示i点距离树上最远点的距离 询问u, 表示求出 dp 数组中最长的连续序列使得序列中最大值-最小值 <= u,输出这个序列的长度. 思路: 求dp数组就是求个树的直径然后dfs一下. 对于每一个询问,能够用一个单调队列维护一下.O(n)的回答. #include <cstdio> #include <cstring> #include <stri…
给定一棵n个点并且有边权的树,每个点的权值为该点能走的最远长度,并输入m个询问,每次询问最多有多少个编号连续的点,他们的最大最小点权差小于等于Q.N<=50000 M<=500 Q<=10000000 我们知道一个点能走的最远端点一定是树的直径的端点,所以我们只需从树的直径两端点dfs,就可以求出每个点能到的最远长度..然后rmq+尺取即可. 这道题如果用系统的log会tle,所以必须手打log2.原理会再放一篇博客. #include <cctype> #include &…
传送门 题意 有n个小镇,Bobo想要建造n-1条边,并且如果在u到v建边,那么花费是u到v的最短路长度(原图),问你最大的花费. 分析 比赛的时候没做出来,QAQ 我们首先要找到树的直径起点和终点,方法是 1.任意选一个点,dfs找到最长路的终点 2.从终点反向dfs,找到起点 然后枚举每个点,用倍增lca求出该点到起点与终点距离,取距离大的,注意直径本身会被访问两次,故一开始ans要减去最长路,时间复杂度O(nlogn) 代码 #include<cstdio> #include<cs…
2021.08.09 P7238 迷失森林(树的直径) P7238 「DCOI」迷失森林 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 重点: 1.树的直径两种求法:两次dfs.树形dp 题意: 首先给出一棵以 11 为根,nn 个结点的树,定义为「单位树」. 现有 nn 个结构与「单位树」完全相同的树,要将 nn 个树再用 n-1n−1 条边连接起来. 为方便叙述,用符号 (a,b)(a,b) 表示结点 aa 所代表树中,编号为 bb 的结点. 连接方式如下: 将 nn 棵…
题目链接:https://cn.vjudge.net/problem/POJ-2631 树的直径:树中的最长链 具体思路:随便找一个点bfs,然后找到最长的链,然后再以找到的点作为起点进行bfs,然后找到的最长的链就是树的直径. AC代码: #include<iostream> #include<stack> #include<iomanip> #include<queue> #include<iomanip> #include<vecto…
结论:离树上任意点\(u\)最远的点一定是这颗树直径的一个端点. 证明: 若点\(u\)在树的直径上,设它与直径两个端点\(x,y\)的距离分别为\(S1\).\(S2\),若距离其最远的点\(v\)不是这两个端点, 则\(dist(u,v) > S1 && dist(u,v) > S2\), 则必有\(S1 + dist(u,v) > S1 + S2 或 S2 + dist(u,v) > S1 + S2\),这与\((x,y)\)是直径的 假设相悖. else \…