【传送门:BZOJ1509】


简要题意:

  给你一棵有n个点树

  找出三个点x,y,z

  求从一个点x出发,先到另外两个点中距离x较近的点,再到剩下的那个点的时间


题解:

  我们不妨先假设从x出发,先到y,再到z,这样子的话我们所花费的时间就是dis(x,y)+dis(y,z)

  很显然我们肯定要让dis(y,z)尽可能的大,并且保证dis(x,y)<dis(x,z)

  这样子我们先找出树的直径(任意从一个点找出离它最远的点t,再从t找出它最远的点tt,然后dis(t,tt)就是树的直径)

  那么这个直径就是dis(y,z)

  然后我们找出t和tt到所有点的距离,然后找出min(dis(t,i),dis(tt,i))中的最大值就好了

  注意要用long long


参考代码:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long LL;
struct node
{int x,y,next;LL d;
}a[410000];int len,last[210000];
void ins(int x,int y,LL d)
{len++;a[len].x=x;a[len].y=y;a[len].d=d;a[len].next=last[x];last[x]=len;
}
LL far;int t;
void findfar(int x,int fa,LL d)
{if(d>far) far=d,t=x;for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(y!=fa) findfar(y,x,d+a[k].d);}
}
bool bk;
LL d1[210000],d2[210000];
void findd(int x,int fa,int t)
{for(int k=last[x];k;k=a[k].next){int y=a[k].y;if(y!=fa){if(t==1) d1[y]=d1[x]+a[k].d;else d2[y]=d2[x]+a[k].d;findd(y,x,t);}}
}
int main()
{int n,m;scanf("%d%d",&n,&m);len=0;memset(last,0,sizeof(last));for(int i=1;i<=m;i++){int x,y;LL d;scanf("%d%d%lld",&x,&y,&d);ins(x,y,d);ins(y,x,d);}far=0;findfar(1,0,0);int t1=t;far=0;findfar(t1,0,0);int t2=t;findd(t1,0,1);findd(t2,0,2);LL ans=0;for(int i=1;i<=n;i++) ans=max(ans,min(d1[i],d2[i]));printf("%lld\n",ans+far);return 0;
}

转载于:https://www.cnblogs.com/Never-mind/p/8880276.html

BZOJ1509: [NOI2003]逃学的小孩相关推荐

  1. [BZOJ1509][NOI2003]逃学的小孩

    1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 968  Solved: 489 [Submit][Status ...

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

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

  3. 【luogu4408】 [NOI2003]逃学的小孩 [动态规划 树的直径]

    P4408 [NOI2003]逃学的小孩 就是求一个树的直径 然后再在这个路径中找一点 emmmmmm大概那个意思 就这样吧emmmm 详见代码 1 #include<iostream> ...

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

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

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

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

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

    整理的算法模板合集: ACM模板 看了半天的题原来没有告诉你三个点的坐标,不然直接跑最短路即可.要求最长的时间,所以我们要自己找到三个点,而在树中最长的路径也就是树的直径.那么本题就可以简化为:在一棵 ...

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

    题面传送门 显然最长的一条是树的直径. 那么找到树的直径后另一条枚举点然后跑spfaspfaspfa即可. 代码实现: #include<cstdio> #include<queue ...

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

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

  9. P4408 [NOI2003] 逃学的小孩 题解

    目录 贪心及其证明 C++C++C++ 实现 ::: 贪心及其证明 设 A,BA,BA,B 为树直径的端点 ,,, Distx,yDist_{x,y}Distx,y​ 为树上两点的距离 ,,, 则答案 ...

最新文章

  1. Rabbitmq 相关介绍之双机镜像模式集群配置
  2. 编译Python2.7.10
  3. 赛门铁克公布Q3财报 亏损68亿美元
  4. Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
  5. Asp.net高级程序设计之服务器控件(4)
  6. dj鲜生-01-新建项目-配置数据库
  7. 自定义LinkedList实现
  8. 阿里研究院安筱鹏:数字化,转型与原生并行
  9. linux编译trinitycore,TC编译步骤之二代码安装
  10. 立体井字棋NOIP17提高模拟训练5
  11. 企业微信开发服务端报错汇总(手把手教你企业微信开发五)
  12. 服务器系统怎么用主板做RAID,超微主板怎么创建RAID磁盘阵列 服务器组建RAID0、RAID1图文教程...
  13. 如何快速在Ubuntu18.04.1上安装k8s1.20的简明教程
  14. python发音小程序
  15. 大学英语综合教程二 Unit 4 课文内容英译中 中英翻译
  16. QQ表情包,动态的那种
  17. html5 密码加密,1、5 写注册的后台并写前台html密码加密id 随机
  18. SpringBoot Tomcat 配置https 且443端口也是https(若依为例对接微信小程序的https,小程序也可以访问)
  19. python 解方程 sympy_SymPy解方程的实现
  20. c++练习 日期的顺延显示

热门文章

  1. 安卓倒计时 listview默认选中一项
  2. java类和对象:封装、继承和多态
  3. RTTI机制(运行时类型识别)
  4. pyqt5示例_木辛老师的编程课堂:Python和Qt第一讲之初识PyQt5
  5. ubuntu10.04添加账户示例
  6. Oracle回退不小心drop掉得表
  7. openlayers添加按钮_OpenLayers3加载常用控件使用方法详解
  8. 95-36-200-ChannelHandler-系统Channel-LoggingHandler
  9. 【Elasticsearch】如何在生产中执行Elasticsearch的零停机升级
  10. 【Elasticsearch】2021 年的顶级 ETL 工具......以及对 ETL 说“不”的理由