题目 求树的直径,因为任意两个居住点之间有且只有一条通路,所以这是一棵树. 根据题意父母先从C去A,再去B,或者反过来. 我们一定是要让A到B最大,也要让C到A和B的最小值最大. AB最大一定就是直径了. CA最大直接先求出任意一条直径的两个端点,必定一个是A.一个是B.然后枚举C,找到最大的\(min(CA,CB)\)然后与AB相加即可. #include <bits/stdc++.h> #define int long long #define N 1010011 using namesp…
本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离,最后以每个节点为c枚举求最大距离即可. 1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=200100; 5 int n,m,x,y,z,tot,p,q,head[N];…