Link:

BZOJ 1509 传送门

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] 逃学的小孩的更多相关文章

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

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

  2. BZOJ 1509 逃学的小孩 - 树型dp

    传送门 题目大意: 在一棵树中, 每条边都有一个长度值, 现要求在树中选择 3 个点 X.Y. Z , 满足 X 到 Y 的距离不大于 X 到 Z 的距离, 且 X 到 Y 的距离与 Y 到 Z 的距 ...

  3. BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )

    树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...

  4. BZOJ 1509[NOI 2003]逃学的小孩 树形dp

    1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 995  Solved: 505[Submit][Status][ ...

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

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

  6. 【BZOJ1509】[NOI2003]逃学的小孩 直径

    [BZOJ1509][NOI2003]逃学的小孩 Description Input 第一行是两个整数N(3  N  200000)和M,分别表示居住点总数和街道总数.以下M行,每行给出一条街道的 ...

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

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

  8. NOI 2003 逃学的小孩 (树的直径)

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

  9. BZOJ 1509: [NOI2003]逃学的小孩

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1509 直接求出树的直径,枚举每个点更新一遍答案. #include<cstring> ...

随机推荐

  1. python与execl的读写

    [code=python] #复制execl中的部分数据到另一份execl中的相同位置 import xlrd import xlwt import xlutils.copy path1=" ...

  2. neutron floating ip 限速

    查看浮动ip的id [root@10e131e69e14 oz]# openstack floating ip show 36.111.0.197 +---------------------+--- ...

  3. Scrapy爬取到的中文数据乱码问题处理

    Scrapy爬取到中文数据默认是 Unicode编码的,于是显示是这样的: "country": ["\u56fd\u4ea7\u6c7d\u8f66\u6807\u5f ...

  4. go语言的学习网站

    1)http://www.runoob.com/go/go-data-types.html 2)https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/ ...

  5. Python课程设计 搭建博客

    安装包Github地址 Python综合设计 233博客 注意还有个email文件是需要填入自己信息的,比如最高权限账号和要发送邮件的账号密码 请安装Python2.7环境,本服务器所用环境为 设置环 ...

  6. nyoj 题目37 回文字符串

    回文字符串 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 所谓回文字符串,就是一个字符串,从左到右读和从右到左读是完全一样的,比如"aba".当 ...

  7. [poj] 2749 building roads

    原题 2-SAT+二分答案! 最小的最大值,这肯定是二分答案.而我们要2-SATcheck是否在该情况下有可行解. 对于目前的答案limit,首先把爱和恨连边,然后我们n^2枚举每两个点通过判断距离来 ...

  8. [转]Linux下阅读源代码:(g)vim+Taglist+ctags

      Linux下阅读源代码的方法很多,聪明人从标题应该就可以知道,需要(g)vim+Taglist+ctags.3者配合,真是珠联璧合,功力无限啊! vim/gvim什么是vim/gvim,如果看官连 ...

  9. position:absolute和float隐式改变display为inline-block

    不论之前是什么类型的元素(display:none除外), 只要设置了position:absolute或float, 都会让元素以display:inline-block的方式显示, 可以设置长宽, ...

  10. Avito Cool Challenge 2018:C. Colorful Bricks

    C. Colorful Bricks 题目链接:https://codeforces.com/contest/1081/problem/C 题意: 有n个横向方块,一共有m种颜色,然后有k个方块的颜色 ...