BZOJ1509: [NOI2003]逃学的小孩(树的直径)
Submit: 1126 Solved: 567
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 1
2 3 1
3 4 1
Sample Output
HINT
Source
这题比较naive吧。。
不过我一开始以为C是给出的。
很显然$AB$一定是树的直径。
敲完了才发现C是不固定的以为自己白写了。
但实际上只需要求出直径的端点到每个点的距离,然后在小的里面取最大就好了
#include<cstdio> #include<vector> #include<algorithm> #include<cstring> #include<map> #include<cmath> #include<queue> #define int long long using namespace std; const int INF = 1e9 + 10, MAXN = 1e6 + 10; inline int read() {char c = getchar(); int x = 0, f = 1;while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x * f; } int N, M; struct Edge {int u, v, w, nxt; }E[MAXN]; int head[MAXN], num = 1; inline void AddEdge(int x, int y, int z) {E[num] = (Edge) {x, y, z, head[x]};head[x] = num++; } int dis[MAXN], mx, mxdis; void dfs(int x, int fa) {for(int i = head[x]; i != -1; i = E[i].nxt) {if(E[i].v == fa) continue;dis[E[i].v] = dis[x] + E[i].w;dfs(E[i].v, x);if(dis[E[i].v] > mxdis) mxdis = dis[E[i].v], mx = E[i].v;} } int Node1, Node2, dis1[MAXN], dis2[MAXN]; int GetAns() {memset(dis, 0, sizeof(dis)); dfs(Node1, 0);for(int i = 1; i <= N; i++) dis1[i] = dis[i];memset(dis, 0, sizeof(dis)); dfs(Node2, 0);for(int i = 1; i <= N; i++) dis2[i] = dis[i];int rt = 0;for(int i = 1; i <= N; i++)rt = max(rt, min(dis1[i], dis2[i]));return rt; } main() { #ifdef WIN32freopen("a.in", "r", stdin); #endifmemset(head, -1, sizeof(head));N = read(); M = read();for(int i = 1; i <= M; i++) {int x = read(), y = read(), z = read();AddEdge(x, y, z);AddEdge(y, x, z);}dfs(1, 0); Node1 = mx;memset(dis, 0, sizeof(dis)); mxdis = 0;dfs(mx, 0); Node2 = mx;int ans = dis[mx];printf("%I64d", ans + GetAns()); }
BZOJ1509: [NOI2003]逃学的小孩(树的直径)相关推荐
- P4408 [NOI2003] 逃学的小孩(树的直径)
[NOI2003] 逃学的小孩 - 洛谷https://www.luogu.com.cn/problem/P4408一道学习树的直径的好题. 题目要求最长的时间,说明答案应该是树的直径+max(起点离 ...
- [BZOJ1509][NOI2003]逃学的小孩
1509: [NOI2003]逃学的小孩 Time Limit: 5 Sec Memory Limit: 64 MB Submit: 968 Solved: 489 [Submit][Status ...
- BZOJ1509: [NOI2003]逃学的小孩
[传送门:BZOJ1509] 简要题意: 给你一棵有n个点树 找出三个点x,y,z 求从一个点x出发,先到另外两个点中距离x较近的点,再到剩下的那个点的时间 题解: 我们不妨先假设从x出发,先到y,再 ...
- 【luogu4408】 [NOI2003]逃学的小孩 [动态规划 树的直径]
P4408 [NOI2003]逃学的小孩 就是求一个树的直径 然后再在这个路径中找一点 emmmmmm大概那个意思 就这样吧emmmm 详见代码 1 #include<iostream> ...
- 洛谷 P4408 [NOI2003] 逃学的小孩(树的直径)
[NOI2003] 逃学的小孩 题目描述 Chris 家的电话铃响起了,里面传出了 Chris 的老师焦急的声音:"喂,是 Chris 的家长吗?你们的孩子又没来上课,不想参加考试了吗?&q ...
- 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 为树上两点的距离 ,,, 则答案 ...
最新文章
- python微信自动机器人
- 对话中国经济和信息化-万祥军:李玉庭制造企业重整电商
- python硬件测试开发_用python实现高性能测试工具(一)
- 全概公式和贝叶斯公式的理解
- The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
- 基于PyTorch的CV框架,北大学生出品TorchCV
- oracle事件号,oracle8管理员账号密码Oracle-等待事件解读
- 十四、w、vmstat、top、sar命令
- 你是如何看待 ‘裸辞’ 这件事的?
- EPC901安装XP
- 华成英-模拟电子技术P8 放大电路的分析方法 讨论题目
- 3dmax如何快速查找丢失贴图,并根据贴图快速找到对应物体
- java tfidf_Hanlp分词实例:Java实现TFIDF算法
- python毕业设计总结范文大全_毕业设计心得体会范文3篇
- 纸的大小图解_纸张的尺寸标准
- Android N 分屏适配
- aws lambda_借助AWS Elastic Beanstalk轻松进行Spring Boot部署
- python自动化测试培训脱产_柠檬班python自动化测试课程完整版
- 计算机可靠度计算公式,可靠性计算公式大全
- 北邮智能车仿真培训(七)—— 使用c++编写程序
热门文章
- linux 写结构体到文件
- mysql 判断字段为null表示 false 其它为true_日拱一卒,MySQL数据库 常用SQL优化技巧 十一式...
- 纸板怎么切割光滑_激光切割机大PK!光纤、CO2、YAG,你选谁?!
- Spring MVC 验证码
- ubuntu18 激活 pycharm
- css 菜单栏悬停_在CSS中构建悬停菜单
- 迈入现代 Web 开发(GMTC 2021 演讲全文)
- Linux之tomcat日志管理
- Linux下java -version版本不对
- TFS 2012研发管理能力(9)