题目

求树的直径,因为任意两个居住点之间有且只有一条通路,所以这是一棵树。

根据题意父母先从C去A,再去B,或者反过来。

我们一定是要让A到B最大,也要让C到A和B的最小值最大。

AB最大一定就是直径了。

CA最大直接先求出任意一条直径的两个端点,必定一个是A、一个是B。然后枚举C,找到最大的\(min(CA,CB)\)然后与AB相加即可。

#include <bits/stdc++.h>
#define int long long
#define N 1010011
using namespace std;
struct edg {
int from, to, nex, len;// vis表示是否在最大生成树上
}e[N * 2];
int n, m, cnt, ans, ansk, lin[N], dis1[N], vis[N];// 这必是一颗树
int disk[N];
inline void add(int f, int t, int c)
{
e[++cnt].nex = lin[f];
e[cnt].to = t;
e[cnt].len = c;
lin[f] = cnt;
}
void dfs(int now)
{
vis[now] = 1;
for (int i = lin[now]; i; i = e[i].nex)
{
int to = e[i].to;
if (!vis[to])
{
dis1[to] = dis1[now] + e[i].len;
ans = max(ans, dis1[to]);
dfs(to);
}
}
}
void dfs2(int now)
{
vis[now] = 1;
for (int i = lin[now]; i; i = e[i].nex)
{
int to = e[i].to;
if (!vis[to])
{
disk[to] = disk[now] + e[i].len;
if (disk[to] > ans)
ans = max(ans, disk[to]), ansk = to;
dfs2(to);
}
}
}
signed main()
{
scanf("%lld%lld", &n, &m);
for (int i = 1, a, b, c; i <= m; i++)
{
scanf("%lld%lld%lld", &a, &b, &c);
add(a, b, c);
add(b, a, c);
}
dfs(1);
int maxn = 0, maxk = 0;
for (int i = 2; i <= n; i++)
{
if (dis1[i] > maxn)
{
maxn = dis1[i];
maxk = i;
}
}
ans = 0;
maxn = 0;
memset(vis, 0, sizeof(vis));
dfs2(maxk);
memset(vis, 0, sizeof(vis));
memset(dis1, 0, sizeof(dis1));
dfs(ansk);
for (int i = 1; i <= n; i++)
{
if (i == maxk || i == ansk) continue;
maxn = max(maxn, min(dis1[i], disk[i]));
}
printf("%lld", maxn + ans);//ans是树的直径大小。
} /*
4 3
1 2 1
1 3 1
1 4 2
5
*/

洛谷P4408 逃学的小孩的更多相关文章

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

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

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

    题目传送门 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:“喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?”一听说要考试,Chris的父母就心急如焚, ...

  3. 洛谷 P4408 [NOI2003] 逃学的小孩 题解

    Analysis 题意虽然说先去谁家再去谁家,但是我们不需要管这个,因为AA.BB.CC三个点我们可以任意互相交换它们所代表的对象,所以题目要求的就是在一棵树上找到3个点AA.BB.CC令AB+BCA ...

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

    本题就是从c到a/b再到b/a距离的最大值,显然,a和b分别是树的直径的两个端点,先用两次dfs求出树的直径,再用一次dfs求出每个点到a的距离,最后再用一次dfs求出每个点到距离它较近的a/b的距离 ...

  5. P4408 逃学的小孩 题解

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

  6. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  7. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  8. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  9. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

随机推荐

  1. .Net Core WepApi-JWT认证

    JWT 介绍 JWT(Json Web Token)是一种开放标准,已Json对象的方式在各方之间安全地传输信息 JWT登陆状态不在服务器端进行存储,而是通过秘钥生成一个具有有效时间的Token返回给 ...

  2. That IP address can't be assigned to.的问题

    That IP address can't be assigned to. 烦恼了很久,现在知道了,解决的办法如下 首先确定端口号是不是开放,阿里云的直接在控制台修改 其次 看看 你的地址是不是输入错 ...

  3. Web开发基础知识

    综述 最近开始Java Web方面的工作,千里之行始于足下,我们在开发过程中要善于总结自己遇到的问题.善于管理一些优秀的代码片段.本文的主要内容是Web开发的基础知识,对于大牛来说可以忽略,对于初入W ...

  4. 谈谈OAuth1,OAuth2异同

    ##一.写在前面在收集资料时,我查询和学习了许多介绍OAuth的文章,这些文章有好有坏,但大多是从个例出发.因此我想从官方文档出发,结合在stackoverflow上的一些讨论,一并整理一下.整理的内 ...

  5. H3C 802.11 MAC层工作原理

  6. 计算机网络基础之IP地址详解

    计算机网络基础之IP地址详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.IP地址概述 1>.什么是IP地址 我们为什么要使用逻辑地址(IP地址)来标识网络设备,而不采 ...

  7. Python入门篇-数据结构树(tree)篇

    Python入门篇-数据结构树(tree)篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.树概述 1>.树的概念 非线性结构,每个元素可以有多个前躯和后继 树是n(n& ...

  8. 利用Git钩子实现代码发布

    目录 1.什么是git钩子 2.安装一个钩子 3.常用的钩子脚本类型 3.1 客户端钩子 3.1.1 pre-commit 3.1.2 prepare-commit-msg 3.1.3 commit- ...

  9. 关于ssh_config和sshd_config

    转载:https://www.cnblogs.com/panda2046/p/5933498.html   在远程管理linux系统基本上都要使用到ssh,原因很简单:telnet.FTP等传输方式是 ...

  10. moviepy这个版本,除了字幕,基本可用

    只是注意,开头要坚拍,中间要横拍,结尾图左上右下. 哈哈,如果不是这样,那就要调调角度了. from moviepy.editor import * from moviepy.video.tools. ...