题目大意:
  给你一棵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]直径相关推荐

  1. [SDOI2013]直径 (树的直径,贪心)

    题目链接 Solution 我们直接找到一条直径 \(s\),起点为 \(begin\),终点为 \(end\). 从前往后遍历点 \(u\) ,若子树中最大的距离与 \(dis(u,begin)\) ...

  2. 【洛谷 P3304】[SDOI2013]直径(树的直径)

    题目链接 题意,求一棵树被所有直径经过的边的条数. 这题是我们8.25KS图论的最后一题,当时我果断打了暴力求所有直径然后树上差分统计的方法,好像有点小问题,boom0了. 考完改这题,改了好久,各种 ...

  3. bzoj3124 [Sdoi2013]直径 直径+树形dp

    这个题标签为什么会有网络流.. 首先树的直径求法就是两遍dfs 然后以其中一个为树的根,统计子树到节点的最长距离与次长距离: 符合条件的点一定是最长距离唯一的,且次长距离与到根的距离不相等 注: 1. ...

  4. [51nod] 1766树上的最远点对 树的直径 树剖LCA+ST表静态查询

    题意: 给你一棵带权树,q次查询,每次给出两个区间,[l1,r1][l2,r2][l_1,r_1] [l_2,r_2][l1​,r1​][l2​,r2​]从这两个区间中分别选择两个数字,使得这两个点的 ...

  5. 小A与欧拉路(牛客-树的直径)

    题解: 欧拉路:从图中任意一个点开始到图中任意一个点结束的路径,并且图中每条边只通过恰好一次 问你走完这树上所有的点最短路径是什么. 因为树是没有环的,所以你走到叶子结点的时候需要往回走,也就是再走一 ...

  6. luogu P3306 [SDOI2013] 随机数生成器(BSGS,数列求通项,毒瘤特判)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 发个水题的 题解证明我还在() luogu P3306 [SDOI2013] 随机数生成器 Webli ...

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

    整理的算法模板合集: ACM模板 看了半天的题原来没有告诉你三个点的坐标,不然直接跑最短路即可.要求最长的时间,所以我们要自己找到三个点,而在树中最长的路径也就是树的直径.那么本题就可以简化为:在一棵 ...

  8. 模板 - 树上问题(树的直径、动态查询树的直径、树的重心)

    整理的算法模板合集: ACM模板 目录 一.树的直径 树形DP 两次DFS / BFS(找到直径的两个端点) 二.动态修改树的边权并求每个时刻的直径(线段树) 三.树的重心 一.树的直径 树的直径满足 ...

  9. 【树的直径】解题报告: luogu P3629 [APIO2010]巡逻(树的直径,位运算成对变换,思维)

    题目链接:P3629 [APIO2010]巡逻 首先看题,从1号结点开始,全部遍历并回到1号结点会恰好经过所有的边两次,这样总长度为 2∗(n−1)2*(n-1)2∗(n−1). 那么如果建立一条路以 ...

最新文章

  1. nginx代理响应报文体不全解决思路
  2. 论网络游戏如何结合社区设计
  3. 替换Webbrowser默认的弹出菜单
  4. C#引用类型转换的几种方式
  5. mysql密码正确但无法连接【彻底解决方案】
  6. 1.1 编程语言介绍
  7. C++ static 用法
  8. 如何将tomcat默认页面换成项目首页?
  9. PHP错误日志记录:display_errors与log_errors的区别
  10. Excel函数 (使用 「index + match」代替 vlookup进行查询)
  11. 通过hsv筛选颜色 python_OpenCV-Python 光流介绍(附代码)
  12. [转]Java杂谈(六)
  13. 使用和编辑Mac的特殊触摸板命令?你值得一看
  14. 云接入时发现的一个问题,记录避免以后踩坑
  15. 《JavaScript高级程序设计》目录笔记
  16. Android11.0 SystemUI 修改下拉菜单快捷键的图标
  17. JSP Commons-FileUpload 组件实现文件上传
  18. 工程师一定要有 “Owner 意识”
  19. 【RegNet】《Designing Network Design Spaces》
  20. 远程语音 开源_通过开源语音聊天简化远程会议

热门文章

  1. 单片机六位抢答器c语言程序,八路电子抢答器(基于51单片机的8路抢答器设计C语言程序)...
  2. python如何使用sdk_Python_sdk首页、文档和下载 - 优图人脸识别sdk - OSCHINA - 中文开源技术交流社区...
  3. ts定义数组类型_TypeScript 数组的类型
  4. vplex实施手册_VPLEX 运维及异构存储双活使用实例技术 | 在线答疑
  5. python文件审计系统_Python代码审计实战案例总结之CRLF和任意文件读取
  6. 引用父类成员的关键字是java_[Java] super关键字:引用父类成员
  7. html dom事件不包括,HTML DOM - 事件
  8. php怎么自己写框架,PHP学习笔记,自己动手写个MVC的框架
  9. 国土空间规划数据汇交标准_国土空间规划数据治理指南来了
  10. 计算机的cpu怎么设计出来的,CPU是如何制作出来的?cpu的制造流程介绍