树网的核

2007年NOIP全国联赛提高组

 时间限制: 1 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
 
题目描述 Description

【问题描述】
设 T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我
们称T 为树网(treenetwork),其中V, E分别表示结点与边的集合,W 表示各边长度的集合,
并设T 有n个结点。
路径:树网中任何两结点a,b 都存在唯一的一条简单路径,用d(a,b)表示以a,b 为端点的
路径的长度,它是该路径上各边长度之和。我们称d(a,b)为a,b 两结点间的距离。
一点v到一条路径P的距离为该点与P 上的最近的结点的距离:
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。

输入描述 Input Description

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

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

输出描述 Output Description

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

样例输入 Sample Input

【输入样例1】
5 2
1 2 5
2 3 2
2 4 4
2 5 3

【输入样例2】
8 6
1 3 2
2 3 2
3 4 6
4 5 3
4 6 4
4 7 2
7 8 3

样例输出 Sample Output

【输出样例1】

5

【输出样例1】

5

数据范围及提示 Data Size & Hint

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

/*
分三步
一:求出树的直径
二:标记直径上的点
三:计算偏心距
n比较小,floyed可做
*/
#include<iostream>
#include<cstdio>
#include<cstring> #define N 307
#define inf 0x3f3f3f3f using namespace std;
int dis[N][N],point[N];
int n,m,ans,cnt,S,tmp; inline int read()
{
int x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} void floyed()
{
for(int k=;k<=n;k++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j && j!=k) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
} int main()
{
int x,y,z;
n=read();S=read();
for(int i=;i<=n;i++) for(int j=;j<=n;j++)
if(i!=j) dis[i][j]=inf;
for(int i=;i<n;i++)
{
x=read();y=read();z=read();
dis[x][y]=z;dis[y][x]=z;
} floyed();int mx=,st,end;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(dis[i][j]>mx && dis[i][j]!=inf) mx=dis[i][j],st=i,end=j; for(int i=;i<=n;i++)
if(dis[st][i]+dis[i][end]==dis[st][end]) point[++cnt]=i; ans=inf;
for(int i=;i<=cnt;i++) for(int j=;j<=cnt;j++)
{
if(dis[point[i]][point[j]]<=S)
{
tmp=;
for(int k=;k<=n;k++)
tmp=max(tmp,(dis[k][point[i]]+dis[k][point[j]]-dis[point[i]][point[j]])/);
ans=min(ans,tmp);
}
}
printf("%d\n",ans);
return ;
}

最新文章

  1. SignalR SelfHost实时消息,集成到web中,实现服务器消息推送
  2. gRPC源码分析1-SSL/TLS
  3. LeetCode: Linked List Random Node
  4. equals和=,==的区别
  5. redis info命令结果释疑
  6. &lt;转&gt;Java的一些历史
  7. IO流操作-图片操作(二)
  8. C语言数据结构----栈与递归
  9. Windows消息队列
  10. 201521123085 《Java程序设计》第7周学习总结
  11. 如何将外部的obj模型导入OpenGL
  12. Mac上使用jenkins+ant执行第一个程序
  13. Scrum 冲刺 第一日
  14. springboot(一)
  15. Linux命令学习之路——内容剪切:cut
  16. alpha冲刺(5/10)
  17. 实验吧—安全杂项——WP之 你知道他是谁吗?
  18. 解除IE锁定主页批处理
  19. 2016-2017 CT S03E06: Codeforces Trainings Season 3 Episode 6(8/13)
  20. SpringBoot整合ActiveMQ快速入门

热门文章

  1. 在linux服务器上搭建Struts2项目运行环境
  2. xcap发包工具的简单使用2(发送报文)
  3. WebLoad 解析服务器返回的JSON格式内容
  4. [NOIP2005] 提高组 洛谷P1054 等价表达式
  5. 【IntelliJ】IntelliJ IDEA常用设置及快捷键以及自定义Live templates
  6. Visual C++ 网络编程 笔记
  7. React Native学习(五)—— 使用插件react-native-scrollable-tab-view
  8. Layui图标
  9. AtCoder Grand Contest 012 B Splatter Painting(记忆化搜索)
  10. hbase definitive guide 笔记