描述

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

路径:树网中任何两结点a,b都存在唯一的一条简单路径,用d(a, b)表示以a, b为端点的路径的长度,它是该路径上各边长度之和。我们称d(a, b)为a, b两结点间的距离。

D(v, P)=min{d(v, u), u为路径P上的结点}。

树网的直径:树网中最长的路径成为树网的直径。对于给定的树网T,直径不一定是唯一的,但可以证明:各直径的中点(不一定恰好是某个结点,可能在某条边的内部)是唯一的,我们称该点为树网的中心。

偏心距ECC(F):树网T中距路径F最远的结点到路径F的距离,即

ECC(F)=max{d(v, F),v∈V}

任务:对于给定的树网T=(V, E, W)和非负整数s,求一个路径F,他是某直径上的一段路径(该路径两端均为树网中的结点),其长度不超过s(可以等于s),使偏心距ECC(F)最小。我们称这个路径为树网T=(V, E, W)的核(Core)。必要时,F可以退化为某个结点。一般来说,在上述定义下,核不一定只有一个,但最小偏心距是唯一的。

下面的图给出了树网的一个实例。图中,A-B与A-C是两条直径,长度均为20。点W是树网的中心,EF边的长度为5。如果指定s=11,则树网的核为路径DEFG(也可以取为路径DEF),偏心距为8。如果指定s=0(或s=1、s=2),则树网的核为结点F,偏心距为12。

格式

输入格式

包含n行:

第1行,两个正整数n和s,中间用一个空格隔开。其中n为树网结点的个数,s为树网的核的长度的上界。设结点编号以此为1,2,……,n。

从第2行到第n行,每行给出3个用空格隔开的正整数,依次表示每一条边的两个端点编号和长度。例如,“2 4 7”表示连接结点2与4的边的长度为7。

所给的数据都是正确的,不必检验。

输出格式

只有一个非负整数,为指定意义下的最小偏心距。

样例

样例输入

5 2
1 2 5
2 3 2
2 4 4
2 5 3

样例输出

5

限制

1s

提示

40%的数据满足:5<=n<=15
70%的数据满足:5<=n<=80
100%的数据满足:5<=n<=300, 0<=s<=1000。边长度为不超过1000

这个题比较麻烦吧 写了一天才过。。。

一开始想的是 找出直径终点向两边扩展。。。

甚至都想到了二分答案验证。。。。。。。。。

好习惯 。。。

其实呢 它只能选直径上的一段

是什么意思?就是必须是一段 在直径上  可以理解成一条直径上的一段

多条直径 可以只处理一条

因为S只能在一条直径上 不能分叉。。

然后两边dfs/bfs找直径都会。。。

在直径上的点找出非直径点到它的最远距离

枚举树上不超过S的一段 看看到这一段上最远距离的点即为偏心距

都找一遍 取最小值就好了。。。

也可以用floyd处理树上每两个点之间的距离 不过是N^3的复杂度 加强版无法通过

此题有个加强版

见BZOJ  1999

http://www.lydsy.com:808/JudgeOnline/problem.php?id=1999

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int lim=500005;
const int inf=999999999;
int m,n,len;
struct self{int x,y,w;}s[lim*2];
int first[lim*2],nxt[lim*2];int root,son;
int a,b,c,d[lim];
bool flag[lim];
int pre[lim];
bool inside[lim],p;
int ans=inf;int dfs(int i,int dis)
{d[i]=dis;flag[i]=1;int ret=i;for(int e=first[i];e!=-1;e=nxt[e])if(!flag[s[e].y]){pre[s[e].y]=e;int u=dfs(s[e].y,dis+s[e].w);if(d[ret]<d[u])ret=u;}return ret;
}int findlength(int i,int dis)
{d[i]=dis;flag[i]=1;int ret=i;for(int e=first[i];e!=-1;e=nxt[e])if(!flag[s[e].y]&&!inside[s[e].y]){pre[s[e].y]=e;int u=dfs(s[e].y,dis+s[e].w);if(d[ret]<d[u])ret=u;}d[i]=d[ret];return ret;
}void isinside(int i)
{inside[i]=1;if(pre[i]!=0)isinside(s[pre[i]].x);
}int intree(int from,int to)
{int ret=0;for(int e=pre[from];e!=0;e=pre[s[e].x]){if(s[e].y==to)return ret;ret+=s[e].w;}return ret;
}int work(int i,int len)
{int ans=d[i];int a,b,e;for(int e=pre[i];;e=pre[s[e].x]){if(len<s[e].w||e==0){ans=max(ans,intree(son,i));ans=max(ans,intree(s[e].y,root));if(e==0)p=1;return ans;}len-=s[e].w;ans=max(ans,d[s[e].x]);}
}int main()
{memset(first,-1,sizeof(first));memset(nxt,-1,sizeof(nxt));scanf("%d%d",&m,&len);for(a=1;a<m;a++){scanf("%d%d%d",&s[a].x,&s[a].y,&s[a].w);nxt[a]=first[s[a].x];first[s[a].x]=a;s[a+m].x=s[a].y;s[a+m].y=s[a].x;s[a+m].w=s[a].w;nxt[a+m]=first[s[a].y];first[s[a].y]=a+m;}memset(flag,0,sizeof(flag));memset(pre,0,sizeof(pre));root=dfs(1,0);memset(flag,0,sizeof(flag));memset(pre,0,sizeof(pre));son=dfs(root,0);memset(flag,0,sizeof(flag));isinside(son);for(a=1;a<=m;a++)if(inside[a])findlength(a,0);for(a=son;;a=s[pre[a]].x){ans=min(ans,work(a,len));if(a==0||p)break;}cout<<ans<<endl;return 0;}

VIJOS 1362 树网的核相关推荐

  1. [O(N)的我不会]树网的核

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

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

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

  3. 树网的核(codevs 1167)

    题目描述 Description [问题描述] 设 T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我 们称T 为树网(treenetwork),其中V, E分 ...

  4. NOIP2007 树网的核 [BZOJ2282][Sdoi2011]消防

    NOIP2007 树网的核 树的直径的最长性是一个很有用的概念,可能对一些题都帮助. 树的直径 给定一棵树,树中每条边都有一个权值,树中两点之间的距离定义为连接两点的路径边权之和.树中最远的两个节点之 ...

  5. 树网的核 Vijos1362 NOIP2007 树结构 直径 暴搜

    题面在最下方. 树结构的题做多了就会发现,本题所谓的树网的核(一段偏心距ECC最小的路径)一定是在树的直径上的. 我刚开始做的时候没想到这个,然后写了三个dfs讨论每条直径 Orz 其实只要认识到了这 ...

  6. 2017.3.21 树网的核 思考记录

    把这个noip的题搞出来了.. 不是很难,而且我的要求也比较高(虽然以前看到这种题都是直接看题解,因为太复杂不会) 虽然搞出来在luogu 的noip数据 A了,但bzoj还是T了.理论上应该是O(n ...

  7. code1167 树网的核

    floyd+枚举 看点: 1.floyd同时用数组p记录转移节点k,这样知道线段的端点u v就可以得到整条线段 2.任意一点c到线段a b的距离=(d[a][c]+d[c][b]-d[a][b])/2 ...

  8. 洛谷P1099 树网的核

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

  9. bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】

    我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min #include<iostr ...

最新文章

  1. QApplicationQPushButton
  2. Scala学习之类和属性篇(一):定义类的主构造方法
  3. Spring Security Java Config Preview--官方
  4. Windows 10 RedStone2值得期待的五大功能猜想
  5. NHibernate分页的测试
  6. mac上matlab2018a,求助,mac系统 点击配置就报错,matlab版本2018a
  7. 如何用Pygame写游戏(十一)
  8. Java虚拟机专题之内存分配(读书笔记)
  9. C程序设计语言现代方法03:格式化输入输出
  10. mysql5.7企业版下载_MySQL v5.7.20 官方正式版(32/64位 安装版与zip解压版)
  11. 简单介绍 内网与外网IP地址,域名,子网掩码,网关与路由器,ping
  12. C语言经典面试题 与 C语言面试宝典
  13. 关于js导入Excel时,Excel的(年/月/日)日期是五位数字的问题。以及对Excel日期存在的错误的分析和处理。
  14. 33.Redis详解
  15. 秦皇岛科学选育新品种 国稻种芯·中国水稻节:河北谱丰收曲
  16. 【Oracle】TYPE定义的数据类型
  17. 如何做看到总服务器的文件,怎么看到服务器大内存文件夹
  18. 计算机基础知识(基础入门小白专属)三
  19. 同步电路和异步电路的区别
  20. 云原生时代的业务流程编排

热门文章

  1. 关于Ubuntu的IBUS输入法,输入拼音不能正确显示的解决办法。
  2. python execjs window_python爬虫 execjs安装配置及使用
  3. 简易的选择排序与快速排序
  4. Matlab常用数值计算函数总结
  5. python第三方插件登录网易音乐_GitHub - TomoToTomoT/NeteaseCloudMusic-Python: 网易云音乐--python Api...
  6. android反编译汉化,安卓反编译工具(Apk Manager)
  7. 重装系统(WIN10)
  8. 《扬帆优配》机构动向 机构坚定看好芯片股后市
  9. HDU 1730 Northcott Game (Nim博弈)
  10. 多目标优化问题中智能采样时指标的改进方法