本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离,最后以每个节点为c枚举求最大距离即可。

  1. 1 #include<bits/stdc++.h>
  2. 2 using namespace std;
  3. 3 typedef long long ll;
  4. 4 const int N=200100;
  5. 5 int n,m,x,y,z,tot,p,q,head[N];
  6. 6 ll ans,sum,dis[N];
  7. 7 int nxt[N<<1],to[N<<1],w[N<<1];
  8. 8
  9. 9 void add(int x,int y,int z){
  10. 10 nxt[++tot]=head[x];
  11. 11 head[x]=tot;
  12. 12 to[tot]=y;
  13. 13 w[tot]=z;
  14. 14 }
  15. 15
  16. 16 void dfs1(int u,int fa,ll s){
  17. 17 if(s>sum) sum=s,p=u;
  18. 18 for(int i=head[u];i;i=nxt[i]){
  19. 19 int v=to[i];
  20. 20 if(v==fa) continue;
  21. 21 dfs1(v,u,s+w[i]);
  22. 22 }
  23. 23 }
  24. 24
  25. 25 void dfs2(int u,int fa,ll s){
  26. 26 if(s>ans) ans=s,q=u;
  27. 27 for(int i=head[u];i;i=nxt[i]){
  28. 28 int v=to[i];
  29. 29 if(v==fa) continue;
  30. 30 dfs2(v,u,s+w[i]);
  31. 31 }
  32. 32 }
  33. 33
  34. 34 void dfs3(int u,int fa,ll s){
  35. 35 dis[u]=s;
  36. 36 for(int i=head[u];i;i=nxt[i]){
  37. 37 int v=to[i];
  38. 38 if(v==fa) continue;
  39. 39 dfs3(v,u,s+w[i]);
  40. 40 }
  41. 41 }
  42. 42
  43. 43 void dfs4(int u,int fa,ll s){
  44. 44 dis[u]=min(dis[u],s);//在到p的距离和到q的距离中选择更近的那一个
  45. 45 for(int i=head[u];i;i=nxt[i]){
  46. 46 int v=to[i];
  47. 47 if(v==fa) continue;
  48. 48 dfs4(v,u,s+w[i]);
  49. 49 }
  50. 50 }
  51. 51
  52. 52 int main(){
  53. 53 scanf("%d%d",&n,&m);
  54. 54 for(int i=1;i<=m;i++){
  55. 55 scanf("%d%d%d",&x,&y,&z);
  56. 56 add(x,y,z);add(y,x,z);
  57. 57
  58. 58 }
  59. 59 dfs1(1,0,0);//求直径的一个端点p
  60. 60 dfs2(p,0,0);//求直径的另一端点q,和直径长度ans
  61. 61 dfs3(p,0,0);//枚举每个点到p的距离
  62. 62 dfs4(q,0,0);//枚举每个点到q的距离
  63. 63 sum=0;
  64. 64 for(int i=1;i<=n;i++)
  65. 65 sum=max(sum,dis[i]);
  66. 66 printf("%lld\n",sum+ans);
  67. 67 return 0;
  68. 68 }

洛谷P4408 [NOI2003] 逃学的小孩 (树的直径)的更多相关文章

  1. 洛谷 P4408 [NOI2003]逃学的小孩

    题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚, ...

  2. 洛谷 P4408 [NOI2003] 逃学的小孩 题解

    Analysis 题意虽然说先去谁家再去谁家,但是我们不需要管这个,因为AA.BB.CC三个点我们可以任意互相交换它们所代表的对象,所以题目要求的就是在一棵树上找到3个点AA.BB.CC令AB+BCA ...

  3. BZOJ1509: [NOI2003]逃学的小孩(树的直径)

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1126  Solved: 567[Submit][Status][Discuss] Description ...

  4. LUOGU P4408 [NOI2003]逃学的小孩(树的直径)

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚,他们决定在尽 ...

  5. BZOJ1509 [NOI2003]逃学的小孩 树型DP

    题目: 分析: 首先明确我们是要求 min(dist[C][A],dist[C][B])+dist[A][B]. 我们把C当成树根,第一我们可以发现min里面取dist[C][A]或者dist[C][ ...

  6. luogu P4408 [NOI2003]逃学的小孩

    题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听说要考试,Chris的父母就心 ...

  7. 【洛谷 P3629】 [APIO2010]巡逻 (树的直径)

    题目链接 容易发现,当加一条边时,树上会形成一个环,这个环上的每个点都是只要走一次的,也就是说我们的答案减少了这个环上点的个数,要使答案最小,即要使环上的点最多,求出直径\(L\),则答案为\(2(n ...

  8. BZOJ 1509 逃学的小孩(树的直径)

    题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...

  9. 洛谷 P4408 逃学的小孩 解题报告

    P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...

随机推荐

  1. python的嵌入式开发

    今天晚上注定我要玩一夜这个东西,太爽了,给力! 烧写固件成功, http://blog.csdn.net/Lingdongtianxia/article/details/78248888 要点总结:如 ...

  2. EPLAN部件库共享方法

    EPLAN部件库共享方法       关键词: EPLAN部件库共享 EPLAN 摘要:在使用EPLAN时经常会碰到自己电脑里的部件库和公司里其他同事的部件库存在差异,如果不是很平凡的同步所有使用的部 ...

  3. Luogu3402【模板】可持久化并查集 (主席树)

    用\(depth\)按秩合并,不能直接启发,数组开40倍左右 #include <iostream> #include <cstdio> #include <cstrin ...

  4. (防坑)Alphafold 非docker 安装指南

    本指南适用于Linux系统.Alphafold官方也强调尽量使用Linux系统!官方提供了docker版安装步骤. Alphafold简介: 强大的蛋白质结构预测. 开源地址:https://gith ...

  5. "蔚来杯"2022牛客暑期多校训练营9 G Magic Spells【马拉车+哈希】

    四川今天又上热搜了,继南部疫情的未雨绸缪后,龙槽沟是真的倾盆大雨了.我没有兴趣虚伪矫情地对罹难的游人表达同情,因为人与人互不相通徒增谈资:我也没有兴趣居高临下地对擅闯的愚人表达不屑,因为你我皆为乌合之 ...

  6. docker 匿名和具名挂载

    匿名挂载,只指定容器内了,没指定容器外 -v 容器内路径 docker run -d -P --name nginx01 -v /etc/nginx nginx #-P 随机映射端口 ; -v 不指定 ...

  7. 大促活动如何抵御大流量 DDoS 攻击?

    每一次活动大促带来的迅猛流量,对技术人而言都是一次严峻考验.如果在活动期间遭受黑产恶意DDoS攻击,无疑是雪上加霜.电商的特性是业务常态下通常不会遭受大流量DDoS攻击,且对延迟敏感,因此只需要在活动 ...

  8. [第二章 web进阶]XSS闯关-1

    定义:跨站脚本(Cross_Site Scripting,简称为XSS或跨站脚本或跨站脚本攻击)是一种针对网站应用程序的安全漏洞攻击技术,是代码注入的一种.它允许恶意用户将代码注入网页,其他用户浏览网 ...

  9. 游标长时间open导致表无法vacuum问题

    一.问题描述 用户在实际中可能会碰到类似以下 dead rows 无法 vacuum的问题,一个可能的原因是由于游标未结束的原因. test=# vacuum(verbose) t1; INFO: v ...

  10. 不当使用 union all 导致的SQL解析时间过长的问题优化

    在帮助用户优化应用过程中,发现用户大量使用union all 导致SQL解析非常缓慢的问题.考虑到这个问题很有代表意义,我觉得很有必要对于问题进行总结. 一.用户例子 WITH company_use ...