BZOJ1509: [NOI2003]逃学的小孩
【传送门: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]逃学的小孩相关推荐
- [BZOJ1509][NOI2003]逃学的小孩
1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 968 Solved: 489 [Submit][Status ...
- BZOJ1509: [NOI2003]逃学的小孩(树的直径)
Time Limit: 5 Sec Memory Limit: 64 MB Submit: 1126 Solved: 567 [Submit][Status][Discuss] Descripti ...
- 【luogu4408】 [NOI2003]逃学的小孩 [动态规划 树的直径]
P4408 [NOI2003]逃学的小孩 就是求一个树的直径 然后再在这个路径中找一点 emmmmmm大概那个意思 就这样吧emmmm 详见代码 1 #include<iostream> ...
- 洛谷 P4408 [NOI2003] 逃学的小孩(树的直径)
[NOI2003] 逃学的小孩 题目描述 Chris 家的电话铃响起了,里面传出了 Chris 的老师焦急的声音:"喂,是 Chris 的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...
- P4408 [NOI2003] 逃学的小孩(树的直径)
[NOI2003] 逃学的小孩 - 洛谷https://www.luogu.com.cn/problem/P4408一道学习树的直径的好题. 题目要求最长的时间,说明答案应该是树的直径+max(起点离 ...
- luogu P4408 [NOI2003]逃学的小孩(树的直径)
整理的算法模板合集: ACM模板 看了半天的题原来没有告诉你三个点的坐标,不然直接跑最短路即可.要求最长的时间,所以我们要自己找到三个点,而在树中最长的路径也就是树的直径.那么本题就可以简化为:在一棵 ...
- luogu P4408 [NOI2003]逃学的小孩
题面传送门 显然最长的一条是树的直径. 那么找到树的直径后另一条枚举点然后跑spfaspfaspfa即可. 代码实现: #include<cstdio> #include<queue ...
- 洛谷P4408 [NOI2003]逃学的小孩
链接 https://www.luogu.org/problem/show?pid=4408 大意 求 max{dis[A][B]+min(dis[B][C],dis[A][C])}max\{dis[ ...
- P4408 [NOI2003] 逃学的小孩 题解
目录 贪心及其证明 C++C++C++ 实现 ::: 贪心及其证明 设 A,BA,BA,B 为树直径的端点 ,,, Distx,yDist_{x,y}Distx,y 为树上两点的距离 ,,, 则答案 ...
最新文章
- Rabbitmq 相关介绍之双机镜像模式集群配置
- 编译Python2.7.10
- 赛门铁克公布Q3财报 亏损68亿美元
- Python坑:bool是int的子类、列表循环中的变量泄露、lambda在闭包中会保存局部变量、重用全局变量
- Asp.net高级程序设计之服务器控件(4)
- dj鲜生-01-新建项目-配置数据库
- 自定义LinkedList实现
- 阿里研究院安筱鹏:数字化,转型与原生并行
- linux编译trinitycore,TC编译步骤之二代码安装
- 立体井字棋NOIP17提高模拟训练5
- 企业微信开发服务端报错汇总(手把手教你企业微信开发五)
- 服务器系统怎么用主板做RAID,超微主板怎么创建RAID磁盘阵列 服务器组建RAID0、RAID1图文教程...
- 如何快速在Ubuntu18.04.1上安装k8s1.20的简明教程
- python发音小程序
- 大学英语综合教程二 Unit 4 课文内容英译中 中英翻译
- QQ表情包,动态的那种
- html5 密码加密,1、5 写注册的后台并写前台html密码加密id 随机
- SpringBoot Tomcat 配置https 且443端口也是https(若依为例对接微信小程序的https,小程序也可以访问)
- python 解方程 sympy_SymPy解方程的实现
- c++练习 日期的顺延显示
热门文章
- 安卓倒计时 listview默认选中一项
- java类和对象:封装、继承和多态
- RTTI机制(运行时类型识别)
- pyqt5示例_木辛老师的编程课堂:Python和Qt第一讲之初识PyQt5
- ubuntu10.04添加账户示例
- Oracle回退不小心drop掉得表
- openlayers添加按钮_OpenLayers3加载常用控件使用方法详解
- 95-36-200-ChannelHandler-系统Channel-LoggingHandler
- 【Elasticsearch】如何在生产中执行Elasticsearch的零停机升级
- 【Elasticsearch】2021 年的顶级 ETL 工具......以及对 ETL 说“不”的理由