问题 C: 粉兔找妹子

时间限制: 1 Sec 内存限制: 128 MB

题目描述
粉兔的妹子跑了!

于是,粉兔要去找她跑掉的妹子!

粉兔的妹子在福州某中上学 。

福州某中共有 N 个路口 ,编号从 1 到 N。路口之间由 N−1 条双向通行的道路连接,并且任意两个路口之间都是连通的。所有只有一条道路与之连接的路口都是福州某中的出入口。一些路口旁有教学楼。粉兔的妹子每天会从某个入口进去,到某栋教学楼上课,然后再从某个出口离开福州某中 。

由于妹子热爱锻炼身♂体, 所以他总是想使自己一天中走的总路程尽量长。当然,妹子不喜欢走重复的路,所以每天他都不会经过同一条路两次。也就是说,妹子会选择一对出入口使得从到教学楼、出口的距离和最大,并且两条路径不会经过同一条道路。可以证明,在不重复经过同一条道路的前提下,连接两个路口的路径是唯一的,从而它们间的距离也是唯一的。

粉兔通过某种手段控制了福州某中所有教学楼里的监摄像头,并掌握了每天妹子上课的教学楼。现在她想知道,妹子每天分别走了多长的路?

注意两个相同路口的距离为 0。
输入
第一行两个整数 N 和 M,分别表示福州某中的路口个数和总天数。
接下来 N−1 行,每行三个整数,Si,Ti和 Li,代表一条连接路口 Si 和 Ti、长度为 Li的道路 。
接下来 M 行,每一个整数 Ai,代表妹子第 i 天上课的教学楼旁路口编号。
输入数据保证合法。
输出
输出 M 行,分别代表妹子每一天走的路程之和。
样例输入 Copy
8 3
1 2 2
2 3 4
3 4 1
4 5 7
4 6 3
2 7 5
1 8 6
3
6
7
样例输出 Copy
20
16
17
提示

对于3号路口,粉兔的妹子会选择从5号入口出发,依次经过路口4,3,2,1走到8号出口(反着走也可以),总长度:7+1+4+2+6=20;
对于6号路口,妹子选择的路径为6→4→3→2→1→8,总长度:3+1+4+2+6=16;
对于7号路口,妹子选择的路径为7→2→3→4→5,总长度:5+4+1+7=17。

对于全部数据, 2≤N≤5×10510^5105,1≤M≤10510^5105,1≤Si,Ti,Ai≤N,1≤Li≤10310^3103。

题意:

给出一棵点数为5e55e55e5的带权树,1e51e51e5次询问,每次询问经过xxx节点的最长路径(最长指的是权值和最大);

思路:

首先要了解用树形DPDPDP求树的直径的思路,本题跟其思路相近。
用dp[u][0]dp[u][0]dp[u][0]表示从uuu到以uuu的子树里的最长距离;
dp[u][1]dp[u][1]dp[u][1]表示从uuu到以uuu的子树里的次长距离;
根据树形DPDPDP的dfsdfsdfs我们就可以处理出这些。
考虑最长路径跟dpdpdp数组有什么关系?dpdpdp数组仅仅是针对子树里的,也就是向下扩展的,而最长路径还可以向上扩展。所以,我们再从根节点dfsdfsdfs一遍,求经过每个点的最长路径,最后O(1)O(1)O(1)查询。
首先,根节点的dpdpdp一定是他本身的答案,因为对于根节点,我们遍历了他所有的节点;而其他节点,只遍历了从根节点到该节点方向的节点;
从根节点向下递推,假设现在正在更新vvv节点,而vvv的父亲节点uuu节点已经被更新过了,那么先要考虑uuu节点的最长路径是否经过vvv节点,如果经过的话,只能用uuu节点的次长路径去更新vvv;不经过的话,用uuu节点的最长路径去更新vvv,这就是换根的过程。
比如样例中的,假设根节点为111(无根树可以任意指定一个节点作为根节点)。现在dpdpdp数组的值已经通过dfs1dfs1dfs1求出来了。

最长距离 次长距离
1 14 6
2 12 5

从111推向222,可以发现dp[2][0]+w=dp[1][0]dp[2][0]+w=dp[1][0]dp[2][0]+w=dp[1][0],也就是说111到子树里的最长路径经过222,所以只能用111到子树里的最长路径去更新222,注意还要加上1,21,21,2的边的权值。
更新完后222的最长距离为121212,次长距离为888,两者相加就是经过222的最长路径。

代码:

const int maxn=1e6+7;vector<PLL>g[maxn];
ll dp[maxn][2],ans[maxn],n,m;void dfs1(int u,int fa){dp[u][0]=dp[u][1]=0;for(auto t:g[u]){ll nex=t.first,w=t.second;if(nex==fa) continue;dfs1(nex,u);if(dp[u][0]<dp[nex][0]+w){dp[u][1]=dp[u][0];dp[u][0]=dp[nex][0]+w;}else if(dp[u][1]<dp[nex][0]+w){dp[u][1]=dp[nex][0]+w;}}
}void dfs2(int u,int fa){for(auto t:g[u]){ll v=t.first,w=t.second;if(v==fa) continue;if(dp[v][0]+w==dp[u][0]){ll d=w+dp[u][1];if(dp[v][0]<d){dp[v][1]=dp[v][0];dp[v][0]=d;}else if(dp[v][1]<d){dp[v][1]=d;}}else{ll d=w+dp[u][0];if(dp[v][0]<d){dp[v][1]=dp[v][0];dp[v][0]=d;}else if(dp[v][1]<d){dp[v][1]=d;}}ans[v]=dp[v][0]+dp[v][1];dfs2(v,u);}
}int main(){n=read,m=read;rep(i,1,n-1){ll u=read,v=read,w=read;g[u].push_back({v,w});g[v].push_back({u,w});}dfs1(1,-1);ans[1]=dp[1][0]+dp[1][1];dfs2(1,-1);while(m--){int x=read;printf("%lld\n",ans[x]);}return 0;
}

UPC2021个人训练赛第39场 C: 粉兔找妹子(换根dp)相关推荐

  1. UPC-2021个人训练赛第20场-部分题解

    目录 RGB Triplets 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 Select Half 题目描述 输入 输出 样例输入 Copy 样例输出 Copy 提示 心灵的抚 ...

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

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

  3. 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FFT)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2021年度训练联盟热身训练赛第四场 H - Rock Paper Scissors(字符串匹配,FF ...

  4. 19级算法训练赛第七场

    19级算法训练赛第七场 传送门:https://vjudge.net/contest/362412#problem/J A - 程序设计:合并数字 蒜头君得到了 n 个数,他想对这些数进行下面这样的操 ...

  5. 2021年度训练联盟热身训练赛第五场

    2021年度训练联盟热身训练赛第五场 链接:https://ac.nowcoder.com/acm/contest/13926 A Binary Seating #include<bits/st ...

  6. 2021年度训练联盟热身训练赛第八场

    目录 2021年度训练联盟热身训练赛第八场 A-Fire on Field 题意 思路 代码 B-Gene Tree 题意 思路 代码 I-Thread Knots 题意 思路 代码 J-Triang ...

  7. 2021UPC个人训练赛第47场

    个人训练赛第47场 A: 加工零件(最短路) 问题 A: 加工零件时间限制: 1 Sec 内存限制: 128 MB 题目描述 凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神 ...

  8. 2021年度训练联盟热身训练赛第三场赛后补题

    2021年度训练联盟热身训练赛第三场赛后补题 A Circuit Math [题目分析] [代码展示] B Diagonal Cut [题目分析] [代码展示] C Gerrymandering [题 ...

  9. 2021年度训练联盟热身训练赛第三场(待补)

    文章目录 前言 一.Circuit Math(后缀表达式---栈&&fgets) 二.Diagonal Cut(gcd最大公因数,数论) 三.expected primary-expr ...

最新文章

  1. T-SQL查询进阶--深入理解子查询
  2. PWN-PRACTICE-CTFSHOW-5
  3. python直接连接oracle_python连接oracle
  4. POJ 1980【Unit Fraction Partition】
  5. MAC编译出错:Undefined symbols for architecture x86_64: “_CFRelease“, referenced from:
  6. 眼图在通信系统中有什么意义_OA协同办公系统存在的意义是什么?协同OA的显着优势又在哪儿?...
  7. 为VS2005添加X64编译平台
  8. 一洗大增大膏是真的吗_久久享欲增大膏跟一洗大结合真的有那么神奇吗?
  9. JZ2440 ping不通电脑的一种可能原因 PING 192.168.88.226 (192.168.88.226): 56 data bytes
  10. windows自动更新下载的目录
  11. Qt 编程使用Sapera LT API 实现盖革雪崩焦平面相机数据采集
  12. 草根程序员转型做项目管理走过的点点滴滴之_华为裁员感想
  13. H2数据库入门,看这篇就对了
  14. 为小米盒子做的两个软件:桌面和浏览器
  15. 面板数据分析及stata应用笔记
  16. OSChina 周二乱弹 —— 对!公交车绝缘体
  17. COB-软封装的一些理解
  18. mPaaS 服务端核心组件:消息推送 MPS 架构及流程设计
  19. python数学建模--线性规划问题案例及求解
  20. Kafka单机部署学习演示案例

热门文章

  1. AXI Ordering Model
  2. Pwnable之[Toddler's Bottle](三)--unlink
  3. js中节点关系及相关操作
  4. Yaw Pitch Roll的变换顺序问题
  5. c语言格式化符,C语言 格式化字符
  6. 微信开发者工具 / 反编译工具CrackMinApp 下载安装
  7. 以太坊应用开发JSON-PRC接口
  8. 洛谷P2619 [国家集训队2]Tree I(带权二分,Kruscal,归并排序)
  9. 华为交换机CE6800系列基于接口划分vlan配置
  10. 开学季好物必备,学生党生活用品大全