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[],b[];
int last[],u,v,next[];
long long dis[],mmm[],op;
bool vv[];
void dfs1(int o,long long p,int q)
{
if(p>op){op=p;u=o;}
for(int i=;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=;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=;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,,sizeof(vv));op=;
dfs1(,,);
memset(vv,,sizeof(vv));op=;
dfs2(u,,);
int distance=dis[v];
cout<<dis[v]<<endl;
memset(vv,,sizeof(vv));
for(int i=v;i!=;i=last[i]) vv[i]=true;
for(int i=v;i!=;i=last[i])
{
op=;
dfs1(i,,);
mmm[i]=op;
}
int j=v;
for(int i=last[v];i!=;i=last[i]) next[i]=j,j=i;
int ans=;
int i;
for(i=j;i!=;i=next[i])
if(dis[v]-dis[i]==mmm[i]) break;
for(;i!=;i=last[i])
{
if(dis[i]==mmm[i]) break;
ans++;
}
cout<<ans<<endl;
return ;
}

[BZOJ3124]直径的更多相关文章

  1. 【bzoj3124】 Sdoi2013—直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 (题目链接) 题意 求树的直径以及直径的交. Solution 我的想法超麻烦,经供参考..思 ...

  2. bzoj3124: [Sdoi2013]直径 树形dp two points

    题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...

  3. BZOJ3124 SDOI2013直径

    本以为必有高论,结果是个思博题.随便找一条直径,最后答案肯定是这条直径上的连续一段,如果某分支长度等于直径上某端的长度这一端都要被剪掉. #include<iostream> #inclu ...

  4. 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)

    [BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...

  5. [bzoj3124] [Sdoi2013]直径

    看了child学长的题解才知道怎么写TAT http://www.cnblogs.com/ctlchild/p/5160272.html 以前不知道直径都是过重心的..代码改着改着就和标程完全一样了Q ...

  6. 2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)

    传送门 一道sbsbsb树形dpdpdp 第一问直接求树的直径. 考虑第二问问的边肯定在同一条直径上均是连续的. 因此我们将直径记下来. 然后对于直径上的每一个点,dpdpdp出以这个点为根的子树中不 ...

  7. bzoj千题计划134:bzoj3124: [Sdoi2013]直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...

  8. BZOJ3124 [Sdoi2013]直径 【树的直径】

    题目 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一棵树上,任意两个节 ...

  9. 【bzoj3124】[Sdoi2013]直径

    1.求树的直径: 先随便取一个点,一遍dfs找到离它最远的点l1,再以l1为起点做一遍dfs,找到离l1最远的点l2   那么l1到l2的距离即为直径   2. 求出有多少条边在这棵树的所有直径上:  ...

随机推荐

  1. R语言中的聚类的使用

    这里的聚类主要用到K-Means和K-Medoide聚类.在进行聚类之前,为了避免不同参数之间量纲不同所造成的影响,先将数据进行(0-1)标准化 # 如参数weight data$weight < ...

  2. 解决:R读取含中文excel文件,read.xlsx乱码问题

    1.新建testexcel.xlsx文件 2.创建R文件:test.R # 定义文件变量 excel_path <- "chapter2/testexcel.xlsx" # ...

  3. Content-Negotiation Header Quality Values

    HTTP: The Definitive Guide 17.3.2 Content-Negotiation Header Quality Values The HTTP protocol define ...

  4. linux, sysrq,acpi,apci,uio,subsystem daemon

    linux, sysrq,acpi,apci Linux设备模型  一.sysfs文件系统: sysfs文件系统是Linux2.6内核引入的,它被看成是与proc.devfs和devpty等同类别的文 ...

  5. linux系统分析命令总结

    一张图片

  6. VI乱码, cat 和 more正常

    今天在做一个东西的时候发现,vi乱码,cat,more这个文件汉字显示也正常,查了网上很多东西最后发现按一种说法改对了: 应该是格式化的问题! 比如man手册的文件有一些格式标记,你用man   ,c ...

  7. 从HD OJ 1005想到的

    杭电OJ [1005](http://acm.hdu.edu.cn/showproblem.php?pid=1005): #####Problem Description > A number ...

  8. xpath草稿

    (一)日期和简介 date:2017/12/18 name:a标签href属性提取抛出异常list index out of range (二)问题详细说明: 以百度新闻页面为例: 1.node_li ...

  9. yum源的报错排除

    echo "http://vault.centos.org/6.5/os/x86_64/" > /var/cache/yum/x86_64/6/base/mirrorlist ...

  10. 永远也记不住的linux环境变量,库文件,头文件,交叉编译...

    一.环境变量1.node-v4.9.1-linux-armv7l1)安装cp node-v4.9.1-linux-armv7l.tar.gz /usr/local/cd /usr/local/tar ...