[BZOJ 1509] 逃学的小孩
Link:
Solution:
一开始受样例影响又犯了想当然的毛病……图中的C点不一定在直径上!
3次$dfs$求出树的直径及直径的两个端点$rt1,rt2$到每个点的距离$d1,d2$,
则结果为$max\{ Diameter+min\{ d1[i],d2[i] \} \}$
Tips:如果要求出直径上每个点或求点到直径端点的距离时,最好还是用2次$dfs$的方法,而不使用一遍$dfs$法
Code:
#include <bits/stdc++.h> using namespace std;
typedef long long ll;
const int MAXN=2e5+;
struct edge{int to,nxt,w;}e[MAXN<<];
int n,m,rt1,rt2,head[MAXN],tot=-;
ll d1[MAXN],d2[MAXN],dia=,res=; void add_edge(int x,int y,int z)
{
e[++tot].nxt=head[x];e[tot].to=y;e[tot].w=z;head[x]=tot;
e[++tot].nxt=head[y];e[tot].to=x;e[tot].w=z;head[y]=tot;
} void dfs(int x,int anc)
{
for(int i=head[x];i!=-;i=e[i].nxt)
{
if(e[i].to==anc) continue;
d1[e[i].to]=max(d1[e[i].to],d1[x]+e[i].w);
dfs(e[i].to,x);
}
} int main()
{
scanf("%d%d",&n,&m);
memset(head,-,sizeof(head));d1[]=-1e15;
for(int i=;i<=m;i++)
{
int x,y,z;scanf("%d%d%d",&x,&y,&z);
add_edge(x,y,z);
} dfs(,);for(int i=;i<=n;i++) if(d1[i]>d1[rt1]) rt1=i;
memset(d1,,sizeof(d1));d1[]=-1e15;dfs(rt1,);
for(int i=;i<=n;i++)
{
if(d1[i]>d1[rt2]) rt2=i;
d2[i]=d1[i];dia=max(dia,d1[i]);
}
memset(d1,,sizeof(d1));dfs(rt2,); for(int i=;i<=n;i++)
res=max(res,dia+min(d1[i],d2[i]));
printf("%lld",res);
return ;
}
[BZOJ 1509] 逃学的小孩的更多相关文章
- BZOJ 1509 逃学的小孩(树的直径)
题意:从树上任找三点u,v,w.使得dis(u,v)+min(dis(u,w),dis(v,w))最大. 有一个结论u,v必是树上直径的两端点. 剩下的枚举w就行了. 具体不会证... # inclu ...
- BZOJ 1509 逃学的小孩 - 树型dp
传送门 题目大意: 在一棵树中, 每条边都有一个长度值, 现要求在树中选择 3 个点 X.Y. Z , 满足 X 到 Y 的距离不大于 X 到 Z 的距离, 且 X 到 Y 的距离与 Y 到 Z 的距 ...
- BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )
树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...
- BZOJ 1509[NOI 2003]逃学的小孩 树形dp
1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 995 Solved: 505[Submit][Status][ ...
- 洛谷 P4408 逃学的小孩 解题报告
P4408 [NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...
- 【BZOJ1509】[NOI2003]逃学的小孩 直径
[BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3 N 200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的 ...
- [NOI2003]逃学的小孩(树的直径)
[NOI2003]逃学的小孩 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一听 ...
- NOI 2003 逃学的小孩 (树的直径)
[NOI2003 逃学的小孩] 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一 ...
- BZOJ 1509: [NOI2003]逃学的小孩
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1509 直接求出树的直径,枚举每个点更新一遍答案. #include<cstring> ...
随机推荐
- CS/BS架构的特点
CS架构 优点: 1.有独立的客户端,安全性高 2.大部分业务都在客户端实现,可以实现很复杂的业务 缺点: 1.对环境要求高,需要安装客户端,推广速度慢 2.需要专门前后台的开发团队,维护成本高 B/ ...
- 六 APPIUM Android 定位方式
文本转自:http://www.cnblogs.com/sundalian/p/5629500.html APPIUM Android 定位方式 1.定位元素应用元素 1.1通过id定位元素 An ...
- 最小化安装Linux的常用配置整理
基于安全性考虑,将服务器进行最小化安装,毕竟软件包越少,漏洞越少,相对来说就约安全,但是最小化安装会给运维带来一些问题和不便,下面是我总结的,常见的一些配置和工具的安装,仅供各位大神参考,如有新的id ...
- Metaspolit
Metaspolit介绍 Metasploit是一款开源的安全漏洞检测工具,安全工作人员常用 Metasploit工具来检测系统的安全性.Metasploit Framework (MSF) 在200 ...
- VS2017+EF+Mysql生成实体数据模型(解决闪退的坑)
原文:VS2017+EF+Mysql生成实体数据模型(解决闪退的坑) 最近要使用VS2017+EF+Mysql,在生成实体数据模型踏过一些坑,在此做个总结. 1.先下载并安装 mysql-connec ...
- JAVA中的使用Filter过滤器设置字符集
Filter是什么? Filter不是一个Servlet,它可以叫做Servlet链,它可以用来改变一个request,修改一个response.它虽然不能产生一个response,但可以在一个req ...
- GCD 开发详情
目录 一.简介 二.dispatch Queue - 队列 三.dispatch Groups - 组 四.dispatch Semaphores - 信号量 五.dispatch Barriers ...
- vADC-KVM and vADC-ESX.ovf
vADC-KVM and vADC-ESX.ovf vADC-ESX.ovf.xml <?xml version="1.0" encoding="UTF-8&q ...
- A Dangerous Maze (II) LightOJ - 1395(概率dp)
A Dangerous Maze (II) LightOJ - 1395(概率dp) 这题是Light Oj 1027的加强版,1027那道是无记忆的. 题意: 有n扇门,每次你可以选择其中一扇.xi ...
- 《c程序设计语言》读书笔记-5.6-指针重写getline等函数
#include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> ...