Description

小Q最近学习了一些图论知识。根据课本,有如下定义。树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度。如果一棵树有N个节点,可以证明其有且仅有N-1 条边。 路径:一棵树上,任意两个节点之间最多有一条简单路径。我们用 dis(a,b)
表示点a和点b的路径上各边长度之和。称dis(a,b)为a、b两个节点间的距离。  
 直径:一棵树上,最长的路径为树的直径。树的直径可能不是唯一的。 
现在小Q想知道,对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边。

Input

第一行包含一个整数N,表示节点数。 
接下来N-1行,每行三个整数a, b, c ,表示点 a和点b之间有一条长度为c
的无向边。

Output

共两行。第一行一个整数,表示直径的长度。第二行一个整数,表示被所有
直径经过的边的数量。

Sample Input


6
3 1 1000
1 4 10
4 2 100
4 5 50
4 6 100

Sample Output

1110
2

【样例说明】
直径共有两条,3 到2的路径和3到6的路径。这两条直径都经过边(3, 1)和边(1, 4)。

HINT

对于100%的测试数据:2≤N≤200000,所有点的编号都在1..N的范围内,

边的权值≤10^9。

就是让你求直径的长和直径并的数量。

直径当然好求,而直径并,一定是在一条直径上。

所以我们可以先求出一条最长链。而所有直径的并一定是最长链上连续的一段。

证明很简单:如果中间有分开而最后又和在一起,显然会形成一个环。

然后我们对于最长链上的每个点,dfs出其子树中理他最远的点,若两点之间的距离等于该点到直径一个端点的距离,那么显然这个点到端点之间这一段就不能用来统计答案了。

然后我们可以从左往右做一便这个操作,反向再做一遍,中间部分即为直径的并。

代码:

#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
vector<int> a[200001],b[200001];
int last[200001],u,v,next[200001];
long long dis[200001],mmm[200001],op;
bool vv[200001];
void dfs1(int o,long long p,int q)
{if(p>op){op=p;u=o;}for(int i=0;i<a[o].size();i++)if((!vv[a[o][i]])&&(a[o][i]!=q)){vv[a[o][i]]=true;dfs1(a[o][i],p+b[o][i],o);}
}
void dfs2(int o,long long p,int q)
{last[o]=q;dis[o]=p;if(p>op){op=p;v=o;}for(int i=0;i<a[o].size();i++)if((!vv[a[o][i]])&&(a[o][i]!=q)){vv[a[o][i]]=true;dfs2(a[o][i],p+b[o][i],o);}
}
int main()
{int n;cin>>n;for(int i=1;i<n;i++){int x,y,z;cin>>x>>y>>z;a[x].push_back(y);b[x].push_back(z);a[y].push_back(x);b[y].push_back(z);}memset(vv,0,sizeof(vv));op=0;dfs1(1,0,0);memset(vv,0,sizeof(vv));op=0;dfs2(u,0,0);int distance=dis[v];cout<<dis[v]<<endl;memset(vv,0,sizeof(vv));for(int i=v;i!=0;i=last[i]) vv[i]=true;for(int i=v;i!=0;i=last[i]){op=0;dfs1(i,0,0);mmm[i]=op;}int j=v;for(int i=last[v];i!=0;i=last[i]) next[i]=j,j=i;int ans=0;int i;for(i=j;i!=0;i=next[i])if(dis[v]-dis[i]==mmm[i]) break;for(;i!=0;i=last[i]){if(dis[i]==mmm[i]) break;ans++;}cout<<ans<<endl;return 0;
}

转载于:https://www.cnblogs.com/Slrslr/p/9398271.html

[BZOJ3124]直径相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

  7. 0x63.图论 - 树的直径与最近公共祖先

    目录 一.树的直径(Diameter) 1.树形DP求树的直径 2.两次BFS/DFS求树的直径 1.POJ 1985.Cow Marathon(DFS求树的直径模板题) 2.AcWing 350. ...

  8. [Bzoj2282]消防(二分答案+树的直径)

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

  9. 利用边缘灰度变化建模,来提高圆环直径求取精度

    简 介: 利用对所获得的圆环边缘亮度平均变化曲线,利用Sigmoid函数进行建模逼近,可以对原来经由HoughCircle所获得的半径进行补偿.对于利用扫描仪所获得的图片进行实际处理,可以看到它可以获 ...

最新文章

  1. Traceback (most recent call last): File AttributeError: 'NoneType' object has no attribute 'group'
  2. c# 因其保护级别而不可访问。只能处理公共类型。
  3. zabbix-agent客户端安装
  4. mysql 自定义函数之判断
  5. B+树 -- MySQL数据库索引
  6. css就近原则_细品100道CSS知识点(上)「干货满满」
  7. wordpress开放注册_WordPress.com开源,欧洲开放数据门户网站以及更多新闻
  8. tushare 安装
  9. 抖音直播违规行为与敏感词处罚,直播必备干货大全丨国仁网络
  10. VMware Workstation 10.0 注册机
  11. 1、vsftpd的简介
  12. 【微信小程序】获取Bmob后端云数据库某一数据表的所有记录
  13. 忠告7 成功 = 能力 X 努力 X 态度
  14. Lunece介绍和简单实用
  15. FPGA学习之串口篇
  16. *restrict 功能
  17. 当YOLOv5遇见OpenVINO!
  18. [tensorflow] 关于 seed
  19. 感恩节如何使用 HTML + CSS 绘制火鸡(Turkey)
  20. echarts 三环圆环_Echarts饼图之圆环图

热门文章

  1. 计算机科学导论数据运算,2-计算机科学导论-数据与运算讲述.ppt
  2. c++位运算_最全位运算总结
  3. DSP之通信之MMC控制器
  4. 安装webpack-cli时遇到的问题
  5. C语言———不定参数标准库 stdarg.h
  6. Redis数据库 | 快速入门 | 自学笔记
  7. 华为鸿蒙系统ui界面会变吗,华为鸿蒙系统:全新UI界面
  8. Windows核心编程_将窗口嵌入到桌面图标下面不被遮挡 spy 分析过程
  9. 使用Visual Studio来创建动态库/静态库,并加载
  10. 微软官方的.net系列文档