【bzoj3124】[Sdoi2013]直径
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]直径的更多相关文章
- bzoj3124: [Sdoi2013]直径 树形dp two points
题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...
- bzoj千题计划134:bzoj3124: [Sdoi2013]直径
http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...
- BZOJ3124 SDOI2013直径
本以为必有高论,结果是个思博题.随便找一条直径,最后答案肯定是这条直径上的连续一段,如果某分支长度等于直径上某端的长度这一端都要被剪掉. #include<iostream> #inclu ...
- [bzoj3124] [Sdoi2013]直径
看了child学长的题解才知道怎么写TAT http://www.cnblogs.com/ctlchild/p/5160272.html 以前不知道直径都是过重心的..代码改着改着就和标程完全一样了Q ...
- 2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)
传送门 一道sbsbsb树形dpdpdp 第一问直接求树的直径. 考虑第二问问的边肯定在同一条直径上均是连续的. 因此我们将直径记下来. 然后对于直径上的每一个点,dpdpdp出以这个点为根的子树中不 ...
- BZOJ3124 [Sdoi2013]直径 【树的直径】
题目 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一棵树上,任意两个节 ...
- BZOJ3124: [Sdoi2013]直径 (树形DP)
题意:给一颗树 第一问求直径 第二问求有多少条边是所有直径都含有的 题解:求直径就不说了 解第二问需要自己摸索出一些性质 任意记录一条直径后 跑这条直径的每一个点 如果以这个点不经过直径能到达最远的 ...
- 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)
[BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...
- [洛谷P3304] [SDOI2013]直径
洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...
- 3124: [Sdoi2013]直径
3124: [Sdoi2013]直径 https://www.lydsy.com/JudgeOnline/problem.php?id=3124 分析: 所有直径都经过的边,一定都是连续的一段.(画个 ...
随机推荐
- 正确地使用Context
Context应该是每个入门Android开发的程序员第一个接触到的概念,它代表当前的上下文环境,可以用来实现很多功能的调用,语句如下. //获取资源管理器对象,进而可以访问到例如 string, c ...
- torch学习笔记(二) nn类结构-Linear
Linear 是module的子类,是参数化module的一种,与其名称一样,表示着一种线性变换. 创建 parent 的init函数 Linear的创建需要两个参数,inputSize 和 outp ...
- js页面跳转定位
A页面 <!DOCTYPE html> <html> <head> <meta name="viewport" content=" ...
- JavaScript中数据类型的转换规则
JavaScript中数据类型的转换规则 制作人:全心全意 JavaScript是一种无类型语言,也就是说,在声明变量时无须指定数据类型,这使得JavaScript更具有灵活性和简单性. 在代码执行过 ...
- jsp include html 乱码问题解决
方法一: 在被包含的html中,在首行加上 <%@ page language="java" import="java.util.*" pageEncod ...
- layuiAdmin 项目修改
layuiAdmin修改 index.js 修改登录url user/login=>publics/login config.js 修改 name 项目名称, tokenName token字段 ...
- python 通过句柄获取窗口内容
-- enoding:utf-8 -- 生成 buffer 对象 import win32con from win32gui import PyMakeBuffer, SendMessage, PyG ...
- UVA 12100 打印队列(STL deque)
题意: 给定n个优先级打印队列,然后从0开始编号到n-1.出队一个元素,如果他是队列中优先级最高的,打印(耗时一分钟),否则放到队尾(不耗时).给定一个m,求位置m的文件打印的时间. 分析: 用一个p ...
- python——进制间的转换
int(string_num, n) string_num表示某种进制的字符串,n表示string_num是什么进制数 2.8.16 进制转为10进制:使用int()或者eval() 10 进制转为 ...
- 对Kaldi nnet3进行奇异值分解(SVD)以减小模型大小
用处 基于SVD实现模型压缩以适配低功耗平台 根据nnet3bin/nnet3-copy,nnet3-copy或nnet3-am-copy的"--edits-config" ...