1.求树的直径:

先随便取一个点,一遍dfs找到离它最远的点l1,再以l1为起点做一遍dfs,找到离l1最远的点l2
   那么l1到l2的距离即为直径
   
2. 求出有多少条边在这棵树的所有直径上:
   两个结论:
   1)这些边一定在同一条直径上
   2)它们一定是连续的 
   因此,只需要处理第一问求出的直径,从l2到l1求出每个点不经过这条直径所能到达的最远距离,若这个距离==它到l1/l2的距离,则这个点到l1/l2所经过的边都不在答案中,答案边的范围被缩小

 #include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std; typedef long long LL; #define IN inline
#define RG register #define N 400010 struct edge
{
int to,next;
LL w;
}e[N<<];
int head[N];
int cnt; LL d[N],c[N],f[N],no[N]; int u,v;
LL w; int n; int ans; LL dis; bool flag; IN int getint()
{
int x=,f=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} IN int getLL()
{
LL x=,f=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} IN void link(int x,int y,LL z)
{
e[++cnt]=(edge){y,head[x],z};
head[x]=cnt;
} IN void dfs(int x,int fa,int & b)
{
f[x]=fa;
if (dis<d[x])
{
dis=d[x];
b=x;
}
for (RG int i=head[x];i;i=e[i].next)
{
int t=e[i].to;
if (t!=fa)
{
d[t]=d[x]+e[i].w;
dfs(t,x,b);
}
}
} IN void work(int x,int fa)
{
if (dis<d[x])
dis=d[x];
for (RG int i=head[x];i;i=e[i].next)
{
int t=e[i].to;
if (t!=fa && !no[t])
{
d[t]=d[x]+e[i].w;
work(t,x);
}
}
} int main()
{
int l1,l2;
n=getint();
for (RG int i=;i<n;i++)
{
u=getint();v=getint();w=getLL();
link(u,v,w);
link(v,u,w);
}
dfs(,,l1);
dis=d[l1]=;
dfs(l1,,l2);
printf("%lld\n",dis);
int l=l1,r=l2;
for (RG int i=l2;i!=;i=f[i])
no[i]=;
for (RG int i=f[l2];i!=l1;i=f[i])
{
int r1=d[i],r2=d[l2]-d[i];
dis=d[i]=;
work(i,);
if (dis==r1 && !flag)
l=i,flag=true;
if (dis==r2)
r=i;
}
for (RG int i=r;i!=l;i=f[i])
ans++;
printf("%d",ans);
return ;
}

【bzoj3124】[Sdoi2013]直径的更多相关文章

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

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

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

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

  3. BZOJ3124 SDOI2013直径

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

  4. [bzoj3124] [Sdoi2013]直径

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

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

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

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

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

  7. BZOJ3124: [Sdoi2013]直径 (树形DP)

    题意:给一颗树 第一问求直径 第二问求有多少条边是所有直径都含有的 题解:求直径就不说了 解第二问需要自己摸索出一些性质 任意记录一条直径后 跑这条直径的每一个点  如果以这个点不经过直径能到达最远的 ...

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

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

  9. [洛谷P3304] [SDOI2013]直径

    洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...

  10. 3124: [Sdoi2013]直径

    3124: [Sdoi2013]直径 https://www.lydsy.com/JudgeOnline/problem.php?id=3124 分析: 所有直径都经过的边,一定都是连续的一段.(画个 ...

随机推荐

  1. 问题:hdfs管理界面:Summary部分,Configured Capacity: 0 B

    hdfs管理界面:Summary部分,Configured Capacity: 0 B.正常应该不是0,而是显示系统分配给hdfs的剩余容量. 原因:NameNode的clusterID和DataNo ...

  2. python pandas读写excel

    import pandas as pd import numpy as np df = pd.read_csv("result.csv") # csv # df = pd.read ...

  3. UIScrollView的contentSize、contentOffset和contentInset属性

    IOS中,UIScrollView是可以滚动的视图,其中最常用的UITableView就是继承了UIScrollView. 跟所有的view一样,UIScrollView有一个frame属性,同时,U ...

  4. for in,Object.keys()与for of的用法与区别

    Array.prototype.sayLength=function(){ console.log(this.length); } let arr = ['a','b','c','d']; arr.n ...

  5. Linux 内核框架图

  6. Codeforces Beta Round #1 补题题解

    A Theatre Square(数学) 算出每行能装多少乘以每列能装多少就行 公式 ans=ceil(n/a)+ceil(m/a) 代码 #include <bits/stdc++.h> ...

  7. Linux一键安装web环境全攻略phpstudy版

    此教程主要是应对阿里云Linux云服务器ecs的web环境安装,理论上不限于阿里云服务器,此教程对所有Linux云服务器都具有参考价值. 写这篇文章的目的:网上有很多关于Linux一键安装web环境全 ...

  8. 树莓派 -- bcm2835 library (1)

    bcm2835 library提供了user space 操作IO的代码. 本文不涉及代码分析,先直观的按照user guide完成操作. 1. 在Raspberry中安装bcm2835 librar ...

  9. POJ 1330 (LCA)

    http://poj.org/problem?id=1330 题意:给出一个图,求两个点的最近公共祖先. sl :水题,贴个模板试试代码.本来是再敲HDU4757的中间发现要用LCA,  操蛋只好用这 ...

  10. 调用系统文件管理器选择图片,调用系统裁剪AIP对图片处理,显示裁剪之后的图片

    package com.pingyijinren.test; import android.annotation.TargetApi; import android.app.Notification; ...