题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999

    https://www.luogu.org/problemnew/show/P1099

“分析性质,O(n)扫描”

看了半天才懂...发现自己对树的直径的相关知识太不熟了...

这篇博客的讲解很详细:https://www.cnblogs.com/shenben/p/5895325.html

说一下自己的理解:

1.每个直径对答案的贡献是相同的;

因为所有直径都相交,所以不妨考虑公共部分和分叉部分;

会发现分叉部分的答案不如公共部分优,因为我们要取最小的偏心距,而分叉部分的偏心距一定会覆盖公共部分;

所以只需要找出一条直径来做;

2.一条直径上找最小偏心距,一定在“核”最长的时候找;

这个很容易想到,因为长“核”一定不会劣于短“核”;

3.对于一个“核”,有三个值可以更新它的偏心距:

①直径上的两端到“核”的两端的两个距离;

②“核”上所有点到直径外子树的最长距离;

其中的①,许多“核”会重复求同样的值,所以干脆把它扩展到整条直径上的点到直径外子树的最大距离,求一遍即可;

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const maxn=;
int n,s,head[maxn],ct,dis[maxn],fa[maxn],l,l2;
bool vis[maxn];
struct N{
int to,next,w;
N(int t=,int n=,int w=):to(t),next(n),w(w) {}
}edge[maxn<<];
void add(int x,int y,int z){edge[++ct]=N(y,head[x],z); head[x]=ct;}
int rd()
{
int ret=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-; ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return ret*f;
}
void dfs(int x)
{
for(int i=head[x];i;i=edge[i].next)
{
int u=edge[i].to;
if(vis[u]||u==fa[x])continue;
dis[u]=dis[x]+edge[i].w;
fa[u]=x; dfs(u);
}
}
int main()
{
n=rd(); s=rd();
for(int i=,x,y,z;i<n;i++)
{
x=rd(); y=rd(); z=rd();
add(x,y,z); add(y,x,z);
}
l=; l2=;
dis[l]=; fa[l]=; dfs(l);
for(int i=;i<=n;i++)
if(dis[i]>dis[l])l=i;
dis[l]=; fa[l]=; dfs(l);
for(int i=;i<=n;i++)
if(dis[i]>dis[l2])l2=i;
int ans=0x3f3f3f3f,j=l2;
for(int i=l2;i;i=fa[i])
{
while(fa[j]&&dis[i]-dis[fa[j]]<=s)j=fa[j];
ans=min(ans,max(dis[j],dis[l2]-dis[i]));//min,max
}
for(int i=l2;i;i=fa[i])vis[i]=;
for(int i=l2;i;i=fa[i])dis[i]=,dfs(i);
for(int i=;i<=n;i++)ans=max(ans,dis[i]);//max
printf("%d",ans);
return ;
}

bzoj1999 (洛谷1099) 树网的核——dfs的更多相关文章

  1. BZOJ1999或洛谷1099&BZOJ2282或洛谷2491 树网的核&[SDOI2011]消防

    一道树的直径 树网的核 BZOJ原题链接 树网的核 洛谷原题链接 消防 BZOJ原题链接 消防 洛谷原题链接 一份代码四倍经验,爽 显然要先随便找一条直径,然后直接枚举核的两个端点,对每一次枚举的核遍 ...

  2. 洛谷 P1099 树网的核

    P1099 树网的核 题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W ...

  3. [NOIP2007] 提高组 洛谷P1099 树网的核

    题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...

  4. 洛谷 P1099 树网的核+P2491 [SDOI2011]消防

    写在前面:由于是双倍经验就放一块了,虽然数据范围差的有点大. 题目链接 题意:在树的直径上选择一条长度不超过s的路径使这条路径上的点到树上任意点的最大距离最小. 这题数据好像非常水,我写了上界n^2不 ...

  5. 洛谷P1099 树网的核

    传送门 80分 $ Floyd $ 树的直径可以通过枚举求出.直径的两个端点$ maxi,maxj $ ,由此可知对于一个点 $ k $ ,如果满足 $ d[maxi][k]+d[k][maxj]== ...

  6. 2018.11.06 洛谷P1099 树网的核(最短路+枚举)

    传送门 之前看李煜东的书一直感觉是道神题. 然后发现这题数据范围只有300?300?300? 直接上floydfloydfloyd然后暴力就完了啊. 代码: #include<bits/stdc ...

  7. [BZOJ1999][codevs1167][Noip2007]Core树网的核

    [BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...

  8. 洛谷1099 [NOIP2007] 树网的核

    链接https://www.luogu.org/problemnew/show/P1099 题目描述 设T=(V,E,W)是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称TTT为 ...

  9. 洛谷P1219 八皇后【dfs】

    题目描述 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行.每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子. 上面的布局可以用序列2 4 6 1 3 ...

随机推荐

  1. stl sort和qsort的使用

    好不容易使用了下stl的qsort函数,顺便和sort函数一起总结下: 很多时候我们都需要用到排序. 例如: 1 #include <iostream> #include <algo ...

  2. Uva 816 Abbott的复仇(三元组BFS + 路径还原)

    题意: 有一个最多9*9个点的迷宫, 给定起点坐标(r0,c0)和终点坐标(rf,cf), 求出最短路径并输出. 分析: 因为多了朝向这个元素, 所以我们bfs的队列元素就是一个三元组(r,c,dir ...

  3. 对SpringMVC框架的理解(转)

    SpringMVC概念:     他是一个轻量级的开源框架,应用于表现层,基于MVC的设计模式. SpringMVC的特点:     1.他是单例的可以设置成多例.     2.他的线程是安全的    ...

  4. 【03】placeholder

    placeholder   表单占位符解决方案 Css Code :-moz-placeholder, ::-webkit-input-placeholder{ color: #bfbfbf; } . ...

  5. JavaEE JDBC ResultSet内外移动

    ResultSet内外移动 @author ixenos 内外移动指位置光标的移动 内移动就是一个ResultSet得到后的那个光标! 外移动就是多个ResultSet的迭代 内移动 一般的数据库都不 ...

  6. Node.js & Unix/Linux & NVM

    Node.js & Unix/Linux & NVM nvm https://github.com/creationix/nvm https://github.com/xyz-data ...

  7. [luoguP1019] 单词接龙(DFS)

    传送门 不知为什么,判断全部包含反而A不了,不判断反而A了,╮(╯▽╰)╭ 代码 #include <cstdio> #include <iostream> #define m ...

  8. poj 1182用向量的思考模式

    不会写果断看答案http://cavenkaka.iteye.com/blog/1489588 #include<stdio.h> #include<string.h> #de ...

  9. 桐桐的糖果计划(vijos 1325)

    背景 桐桐是一个快乐的小朋友,他生活中有许多许多好玩的事,让我们一起来看看吧…… 描述 桐桐很喜欢吃棒棒糖.他家处在一大堆糖果店的附近. 但是,他们家的区域经常出现塞车.塞人等情况,这导致他不得不等到 ...

  10. BZOJ2272: [Usaco2011 Feb]Cowlphabet 奶牛文字

    n<=250个大写字母和m<=250个小写字母,给p<=200个合法相邻字母,求用这些合法相邻字母的规则和n+m个字母能合成多少合法串,答案mod 97654321. 什么鬼膜数.. ...