知识点:树的直径


解题思路

题目中“可以保证,任两个居住点间有且仅有一条通路”说明输入数据是一棵树。显然最优解需要从C先跑到A在跑到B.或者从C先跑到B在跑到A。

假设我们已经确定A,B点,那么AB是必走的,CA,CB会选取其中小的一段走,所以我们的C点要满足min(CA,CB)最大,这样就可以使答案最大。

如何确定A,B点?既然AB是必走的,那当然越长越好,所以就是树的直径了。由于这里只需要求树直径的端点和总长而不用求具体路线,我就选择了DFS来求。

简要介绍一下DFS求直径的方法:随意选取一个点,DFS出离它距离最大的点(设为P),再以P为起点,DFS出离它距离最大的点(设为Q),P,Q两点就是我们的A和B。

记得开long long


代码

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define ll long long
using namespace std;int n,m,u,v,t,k=1,s,e,w,head[400010];
ll maxn,ans,fs[400010],fe[400010],f[400010],d[400010];struct c {int x,next;ll w;
} a[400010];void add(int x,int y,ll w) {a[k].x=y;a[k].next=head[x];a[k].w=w;head[x]=k;k++;
}void dfs(int x,int fa) {if(maxn<d[x]) {maxn=d[x];w=x;}for(int i=head[x]; i; i=a[i].next) {int y=a[i].x;if(y!=fa) {d[y]=d[x]+a[i].w;dfs(y,x);}}
}void dfs2(int x,int fa) {for(int i=head[x]; i; i=a[i].next) {int y=a[i].x;if(y!=fa) {f[y]=f[x]+a[i].w;dfs2(y,x);}}
}int main() {scanf("%d%d",&n,&m);for(int i=1; i<=m; i++) {scanf("%d%d%lld",&u,&v,&t);add(u,v,t);add(v,u,t);}dfs(1,0);s=w;d[s]=0,maxn=0;dfs(s,0);e=w;dfs2(s,0);for(int i=1; i<=n; i++)fs[i]=f[i];f[e]=0;dfs2(e,0);for(int i=1; i<=n; i++)fe[i]=f[i];for(int i=1; i<=n; i++) {if(i!=s&&i!=e)ans=max(ans,min(fe[i],fs[i]));}printf("%lld",ans+maxn);
}

【洛谷 P4408】逃学的小孩【树的直径】相关推荐

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

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

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

    [NOI2003] 逃学的小孩 - 洛谷https://www.luogu.com.cn/problem/P4408一道学习树的直径的好题. 题目要求最长的时间,说明答案应该是树的直径+max(起点离 ...

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

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

  4. 洛谷 P3384 【模板】树链剖分-树链剖分(点权)(路径节点更新、路径求和、子树节点更新、子树求和)模板-备注结合一下以前写的题目,懒得写很详细的注释...

    P3384 [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节 ...

  5. 洛谷P4315 月下“毛景树” 题解

    洛谷P4315 月下"毛景树" 题解 题目链接:P4315 月下"毛景树" 题意:请维护一个数据结构,支持 改第 kkk 条边的边权 结点 uuu 到 vvv ...

  6. 洛谷——P1047 校门外的树 python实现

    洛谷--P1047 校门外的树 python实现 l, m = map(int, input().split(' ')) trees = [True]*(l+1) for i in range(m): ...

  7. 洛谷 P4408 [NOI2003] 逃学的小孩(树的直径)

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

  8. 【洛谷P4408】逃学的小孩【树的直径】

    题目大意: 题目链接:https://www.luogu.org/problemnew/show/P4408 给出一棵树,已知有人一开始在CCC点,要到达AAA点和BBB点(那个近先去哪).求最坏的情 ...

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

    链接 https://www.luogu.org/problem/show?pid=4408 大意 求 max{dis[A][B]+min(dis[B][C],dis[A][C])}max\{dis[ ...

最新文章

  1. 在Ubuntu 16.04.1 LTS上安装XnView Multi Platform图片浏览器0.83
  2. JSP页面的继承(extends)
  3. GDI+中常见的几个问题(6)
  4. java生成密码_java生成密码生成 | 学步园
  5. python发邮件脚本_Python实现的简单发送邮件脚本分享
  6. eclipse中简单实现自己的工具类打包成jar包并在项目中使用
  7. 给树莓派超频[浙大嵌入式系统]
  8. C++开发工程师进阶路线
  9. 手把手教你 3 个 Linux 中快速检测端口的小技巧
  10. Maven-Eclipse使用maven创建HelloWorld Java项目
  11. 19_完成“我的订单”
  12. el-select的写法
  13. 企业级业务架构设计理论与方法
  14. Excel自定义函数
  15. MATLAB小技巧(7)简单帧差法实现
  16. 远程桌面要求更改电源_远程工作实际上可以使老板动态改变电源
  17. matlab解方java_Java:调用window的matlab遇到的问题和解决方案
  18. Ubuntu系统下创建本地源
  19. 数据结构--一元多项式
  20. 【Linux-操作系统】

热门文章

  1. BZOJ 1502 NOI2005 月下柠檬树 Simpson自适应公式
  2. 小明的游戏(博弈论)
  3. 给Java小白,整理一套能上手的简单编程算法题【含答案】!!!
  4. css 设置MP4 video视频背景色透明
  5. android百度地图api两点画线,android百度地图:在地图上绘制点、线、多边形、圆形和文字...
  6. 根据文件路径区分文件的所属类型,并返回对应类型的文件路径
  7. html标签可以嵌套吗,HTML标签的嵌套
  8. 【求职】格灵深瞳 Java 方向面经
  9. java分类读txt里面的数据_java分别读取两个txt文件里的数据再进行比较。再分别列出这两个文件中共有的和分别独有的数据。...
  10. 新荣记、大董、巴奴逆势扩张,高端餐饮的进击与野望