[SDOI2013]直径
题目大意:
给你一棵n个结点的带边权的树,求该树直径必经边的个数。
思路:
显然直径必经的所有边的肯定是一个直径上的连续一段。
(若超过一段,则出现环,就不是树了)
首先求出原树的任一直径。
预处理出该直径上从结点i出发,不经过直径上其它结点的最长链长度far[i]。
从直径的两端往里缩,如果当前缩到的点i的far[i]等于i到被缩的那一端的距离,就说明直径的这一段至少有两种不重合的情况,肯定不是必经部分。
最后看一下中间没有被缩的部分经过了几个边。
1 #include<cstdio> 2 #include<cctype> 3 #include<vector> 4 typedef long long int64; 5 inline int getint() { 6 register char ch; 7 while(!isdigit(ch=getchar())); 8 register int x=ch^'0'; 9 while(isdigit(ch=getchar())) x=(((x<<2)+x)<<1)+(ch^'0'); 10 return x; 11 } 12 const int N=200001; 13 struct Edge { 14 int to,w; 15 }; 16 std::vector<Edge> e[N]; 17 inline void add_edge(const int &u,const int &v,const int &w) { 18 e[u].push_back((Edge){v,w}); 19 e[v].push_back((Edge){u,w}); 20 } 21 bool mark[N]; 22 int from[N],to[N],u,v; 23 int64 dis[N],far[N]; 24 void dfs(const int &x) { 25 for(unsigned i=0;i<e[x].size();i++) { 26 const int &y=e[x][i].to,&w=e[x][i].w; 27 if(y==from[x]) continue; 28 from[y]=x; 29 dis[y]=dis[x]+w; 30 dfs(y); 31 } 32 } 33 void dp(const int &x,const int &par) { 34 for(unsigned i=0;i<e[x].size();i++) { 35 const int &y=e[x][i].to,&w=e[x][i].w; 36 if(y==par||mark[y]) continue; 37 dp(y,x); 38 far[x]=std::max(far[x],far[y]+w); 39 } 40 } 41 int main() { 42 const int n=getint(); 43 for(register int i=1;i<n;i++) { 44 const int u=getint(),v=getint(),w=getint(); 45 add_edge(u,v,w); 46 } 47 dfs(1); 48 for(register int i=1;i<=n;i++) { 49 if(dis[i]>dis[u]) u=i; 50 } 51 dis[u]=from[u]=0; 52 dfs(u); 53 for(register int i=1;i<=n;i++) { 54 if(dis[i]>dis[v]) v=i; 55 } 56 for(register int x=v;x;x=from[x]) { 57 mark[x]=true; 58 to[from[x]]=x; 59 } 60 for(register int x=v;x;x=from[x]) { 61 dp(x,0); 62 } 63 int l=u,r=v; 64 for(register int x=v;x;x=from[x]) { 65 if(far[x]==dis[v]-dis[x]) r=x; 66 } 67 for(register int x=u;x;x=to[x]) { 68 if(far[x]==dis[x]) l=x; 69 } 70 int len=0; 71 for(register int x=r,i=0;x;x=from[x],i++) { 72 if(x==l) len=i; 73 } 74 printf("%lld\n%d\n",dis[v],len); 75 return 0; 76 }
转载于:https://www.cnblogs.com/skylee03/p/8081102.html
[SDOI2013]直径相关推荐
- [SDOI2013]直径 (树的直径,贪心)
题目链接 Solution 我们直接找到一条直径 \(s\),起点为 \(begin\),终点为 \(end\). 从前往后遍历点 \(u\) ,若子树中最大的距离与 \(dis(u,begin)\) ...
- 【洛谷 P3304】[SDOI2013]直径(树的直径)
题目链接 题意,求一棵树被所有直径经过的边的条数. 这题是我们8.25KS图论的最后一题,当时我果断打了暴力求所有直径然后树上差分统计的方法,好像有点小问题,boom0了. 考完改这题,改了好久,各种 ...
- bzoj3124 [Sdoi2013]直径 直径+树形dp
这个题标签为什么会有网络流.. 首先树的直径求法就是两遍dfs 然后以其中一个为树的根,统计子树到节点的最长距离与次长距离: 符合条件的点一定是最长距离唯一的,且次长距离与到根的距离不相等 注: 1. ...
- [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询
题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1,r1][l2,r2]从这两个区间中分别选择两个数字,使得这两个点的 ...
- 小A与欧拉路(牛客-树的直径)
题解: 欧拉路:从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边只通过恰好一次 问你走完这树上所有的点最短路径是什么. 因为树是没有环的,所以你走到叶子结点的时候需要往回走,也就是再走一 ...
- luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...
- luogu P4408 [NOI2003]逃学的小孩(树的直径)
整理的算法模板合集: ACM模板 看了半天的题原来没有告诉你三个点的坐标,不然直接跑最短路即可.要求最长的时间,所以我们要自己找到三个点,而在树中最长的路径也就是树的直径.那么本题就可以简化为:在一棵 ...
- 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)
整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...
- 【树的直径】解题报告: luogu P3629 [APIO2010]巡逻(树的直径,位运算成对变换,思维)
题目链接:P3629 [APIO2010]巡逻 首先看题,从1号结点开始,全部遍历并回到1号结点会恰好经过所有的边两次,这样总长度为 2∗(n−1)2*(n-1)2∗(n−1). 那么如果建立一条路以 ...
最新文章
- nginx代理响应报文体不全解决思路
- 论网络游戏如何结合社区设计
- 替换Webbrowser默认的弹出菜单
- C#引用类型转换的几种方式
- mysql密码正确但无法连接【彻底解决方案】
- 1.1 编程语言介绍
- C++ static 用法
- 如何将tomcat默认页面换成项目首页?
- PHP错误日志记录:display_errors与log_errors的区别
- Excel函数 (使用 「index + match」代替 vlookup进行查询)
- 通过hsv筛选颜色 python_OpenCV-Python 光流介绍(附代码)
- [转]Java杂谈(六)
- 使用和编辑Mac的特殊触摸板命令?你值得一看
- 云接入时发现的一个问题,记录避免以后踩坑
- 《JavaScript高级程序设计》目录笔记
- Android11.0 SystemUI 修改下拉菜单快捷键的图标
- JSP Commons-FileUpload 组件实现文件上传
- 工程师一定要有 “Owner 意识”
- 【RegNet】《Designing Network Design Spaces》
- 远程语音 开源_通过开源语音聊天简化远程会议
热门文章
- 单片机六位抢答器c语言程序,八路电子抢答器(基于51单片机的8路抢答器设计C语言程序)...
- python如何使用sdk_Python_sdk首页、文档和下载 - 优图人脸识别sdk - OSCHINA - 中文开源技术交流社区...
- ts定义数组类型_TypeScript 数组的类型
- vplex实施手册_VPLEX 运维及异构存储双活使用实例技术 | 在线答疑
- python文件审计系统_Python代码审计实战案例总结之CRLF和任意文件读取
- 引用父类成员的关键字是java_[Java] super关键字:引用父类成员
- html dom事件不包括,HTML DOM - 事件
- php怎么自己写框架,PHP学习笔记,自己动手写个MVC的框架
- 国土空间规划数据汇交标准_国土空间规划数据治理指南来了
- 计算机的cpu怎么设计出来的,CPU是如何制作出来的?cpu的制造流程介绍