题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6686

不写题解了,写不动

还有其他简单的做法

#include <bits/stdc++.h>
#define rep(i, a, b) for(int i = (a); i <= (b); i++)
#define per(i, a, b) for(int i = (a); i >= (b); i--)
#define pii pair<int,int>
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define ll long long
#define pb push_back
using namespace std;
const int N = 1e5+1000;
int n,m,f[N][3],g[N][2];
vector<pii>s;
vector<int> nxt[N];
void dfs(int u,int fa) {f[u][0] = 1;f[u][1] = 1;f[u][2] = 1;for(auto v:nxt[u]) {if(v==fa) continue;dfs(v,u);f[u][2] = max(f[u][2],f[v][0]+1);if(f[u][2]>f[u][1]) swap(f[u][2],f[u][1]);if(f[u][1]>f[u][0]) swap(f[u][1],f[u][0]);g[u][1] = max(g[u][1],max(g[v][0],f[v][1]+f[v][0]-1));if(g[u][1]>g[u][0]) swap(g[u][1],g[u][0]);}
}
void dfs2(int u,int fa) {for(auto v:nxt[u]) {if(v==fa) continue;int l,r,len;r = max(g[v][0],f[v][0]+f[v][1]-1);if(f[u][0]!=f[v][0]+1) {len = f[u][0]+1;if(f[u][1]!=f[v][0]+1) l = f[u][0]+f[u][1]-1;else l = f[u][0]+f[u][2]-1;}else l = f[u][1]+f[u][2]-1,len = f[u][1]+1; if(g[u][0]!=max(g[v][0],f[v][0]+f[v][1]-1)) l = max(l,g[u][0]);else l = max(l,g[u][1]);    s.pb(mp(-l,r));s.pb(mp(-r,l));g[v][1] = max(g[v][1],l);if(g[v][1]>g[v][0]) swap(g[v][1],g[v][0]);f[v][2] = max(f[v][2],len);if(f[v][2]>f[v][1]) swap(f[v][2],f[v][1]);if(f[v][1]>f[v][0]) swap(f[v][1],f[v][0]);dfs2(v,u);}
}
int main() {//freopen("a.txt","r",stdin);ios::sync_with_stdio(0);int T;cin>>T;while(T--) {cin>>n;rep(i, 1, n) {nxt[i].clear();f[i][0] = f[i][1] = f[i][2] = 0;g[i][0] = g[i][1] = 0;}s.clear();rep(i, 1, n-1) {int u,v;cin>>u>>v;nxt[u].pb(v);nxt[v].pb(u);}dfs(1,0);dfs2(1,0);sort(all(s));int siz = s.size();ll maxr = s[0].second;ll ans = abs(s[0].first*s[0].second);rep(i, 1, siz-1) {if(s[i].second<=maxr) continue;ans += (s[i].second-maxr)*abs(s[i].first);maxr = s[i].second;}cout<<ans<<endl;}return 0;
}

Rikka with Travels【换根树dp】相关推荐

  1. 51nod1812树的双直径(换根树DP)

    传送门:http://www.51nod.com/Challenge/Problem.html#!#problemId=1812 题解:头一次写换根树DP. 求两条不相交的直径乘积最大,所以可以这样考 ...

  2. 树形dp ---- gym101655 D - Delta Quadrant 树上连通块思维换根 + 树形dp

    题目链接 题目大意: 给你一颗NNN个节点的树,树上每条边有边权就是遍历的时间,你可以从任意节点出发遍历N−kN-kN−k个点并且回到出发点,问你最短的时间是多少? k∈[0,min(N,20)],N ...

  3. Rikka with Travels 动态维护树直径

    Rikka with Travels 题意:求两条不相交的路线长度的有序对数. 题解:暴力枚举每条边对应两个点对应子树的树直径. 注意:不要用倍增求lca,不然时间会挂,要用树剖求. #include ...

  4. 1007 Rikka with Travels Rikka with Travels

    文章目录 Rikka with Travels Rikka with Travels 换根dp #include <bits/stdc++.h> #define mem(ar,num) m ...

  5. 2020牛客多校第一场B虚树+质数筛+换根dp

    题目大意: 1.可以发现阶乘增长是很快的所以你要把整颗树建立出来是不实际的. 2.我们可以假设这棵树已经建出来出来了我们应该怎么搞 首先很明显是一个树形dp, 我们设dp[j],是以j为u到其他点距离 ...

  6. 洛谷 - P4323 [JSOI2016]独特的树叶(树上哈希+换根dp)

    题目链接:点击查看 题目大意:给出一棵 n 个节点的树 A ,再给出一棵 n + 1 个节点的树 B,题目保证了树 B 是树 A 添加了一个叶子结点后的一棵树,只不过编号的顺序不同,现在问这个叶子节点 ...

  7. 牛客多校1 - Infinite Tree(虚树+换根dp+树状数组)

    题目链接:点击查看 题目大意:给出一个无穷个节点的树,对于每个大于 1 的点 i 来说,可以向点 i / minvid[ i ] 连边,这里的 mindiv[ x ] 表示的是 x 的最小质因数,现在 ...

  8. 换根dp求树所有节点的最小深度

    链接:https://ac.nowcoder.com/acm/contest/18072/A 牛妹有一张连通图,由n个点和n-1条边构成,也就是说这是一棵树,牛妹可以任意选择一个点为根,根的深度为0, ...

  9. 牛客挑战赛30 C 小G砍树 换根dp+组合

    链接:https://ac.nowcoder.com/acm/contest/18072/E 题目:给你一棵n个节点的带标号无根树.每次,你可以选择一个度数为1的节点并将它从树上移除.问总共有多少种不 ...

最新文章

  1. keras 的 example 文件 babi_rnn.py 解析
  2. 数据、算法岗的几点经验分享!
  3. gitzip没有作用以及github如何下载单个文件或目录
  4. 如何挖掘网站的核心关键词?
  5. 区块链与边缘计算(3)系统介绍
  6. SAP Gateway service language determination
  7. tensorflow2 训练和预测使用不同的输出层、获取权重参数
  8. collection集合 多少钱_Java集合框架大汇总,建议收藏
  9. python--一些特性
  10. exp imp 及参数
  11. HttpwebRequest - 带ViewState的网页POST请求
  12. WinCE5.0中文模拟器SDK(VS2005)的配置
  13. Unity2019中文补丁下载
  14. STM32F072在8M下的软件延时
  15. matlab 2018 adams,关于ADAMS与MATLAB联合仿真的一点经验
  16. 使用GPS和velodyne 64拼接地图
  17. Excel查找、替换与定位
  18. css表格文字超数量就竖排_css实现文字竖排
  19. element-ui插件pagination分页中、英文语言切换
  20. 微信公众号修改业务域名、JS接口安全域名、网页授权域名

热门文章

  1. 【vue打包】线上部署报错net::ERR_ABORTED 404 (Not Found)
  2. App自动化测试之Java平台下使用Appium测试App(一)
  3. 手把手教你如何安装使用Git(Windows系统)
  4. 手把手教你写web全栈入门项目—React+Koa+MongoDB(3w字教程,真的很详细,有代码)
  5. 计算机无限办公网络应用与推广论文,无线办公局域网的设计与实施(毕业论文终稿).doc...
  6. 数据库编程:存储过程和储存函数
  7. 一个简单的密码登陆界面。C语言
  8. [千峰安全篇9]Public Key Infrastructure
  9. 线性空间,线性子空间,基与维数
  10. oracle-12514,Oracle错误 ORA-12514 解决方法