题目描述

设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。

输入输出格式

输入格式:

输入文件core.in包含n行:

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

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

所给的数据都是争取的,不必检验。

输出格式:

输出文件core.out只有一个非负整数,为指定意义下的最小偏心距。

输入输出样例

输入样例#1:

【输入样例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

输出样例#1:

【输出样例1】
5
【输出样例2】
5

说明

40%的数据满足:5<=n<=15

70%的数据满足:5<=n<=80

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

NOIP 2007 提高第四题

又是卡题面的题。

原题有张说明图来着,然而好多OJ站上都没放图。

先floyd跑出最短路,然后根据最短路,O(n)扫描两次找出树直径。因为数据比较小,所以可以枚举所求直径F的两端点(只在已找出的直径上选点),并记录最小答案。

 1 /*by SilverN*/
 2 #include<algorithm>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<cstdio>
 6 #include<cmath>
 7 #include<vector>
 8 using namespace std;
 9 const int mxn=1010;
10 int read(){
11     int x=0,f=1;char ch=getchar();
12     while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();}
13     while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();}
14     return x*f;
15 }
16 int mp[mxn][mxn];
17 int n,s;
18 int hd,tl;//树直径端点
19 void init(){
20
21     int i,j,k;
22     for(int k=1;k<=n;k++){
23         for(i=1;i<=n;i++)
24          for(j=1;j<=n;j++){
25              if(i==j)continue;
26              mp[i][j]=min(mp[i][j],mp[i][k]+mp[k][j]);
27          }
28     }
29     for(i=1;i<=n;i++)mp[i][i]=0;
30     int mx=0;
31     for(i=1;i<=n;i++)
32         if(mp[1][i]>mx){
33             mx=mp[1][i];
34             hd=i;
35         }
36     mx=0;
37     for(i=1;i<=n;i++)
38         if(mp[hd][i]>mx){
39             mx=mp[hd][i];
40             tl=i;
41         }
42     return;
43 }
44 int node[mxn],cnt=0;
45 int main(){
46     memset(mp,0x3f,sizeof mp);
47     int i,j;
48     n=read();s=read();
49     int u,v,d;
50     for(i=1;i<n;i++){
51         u=read();v=read();d=read();
52         mp[u][v]=mp[v][u]=d;
53     }
54     init();
55     for(i=1;i<=n;i++)
56         if(mp[hd][i]+mp[i][tl]==mp[hd][tl]) node[++cnt]=i;
57     int ans=1e9;
58     for(i=1;i<=cnt;i++)
59      for(j=1;j<=cnt;j++){
60          if(mp[node[i]][node[j]]>s)continue;
61          int p1=1e9,p2=1e9;
62          p1=min(mp[hd][node[i]],mp[hd][node[j]]);
63          p2=min(mp[tl][node[j]],mp[tl][node[i]]);
64 //         printf("i:%d  j:%d  mx:%d\n",i,j,max(p1,p2));
65          ans=min(ans,max(p1,p2));
66      }
67     printf("%d",ans);
68     return 0;
69 }

转载于:https://www.cnblogs.com/SilverNebula/p/6016509.html

[NOIP2007] 提高组 洛谷P1099 树网的核相关推荐

  1. 洛谷P1099 树网的核

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

  2. [NOIP2006] 提高组 洛谷P1066 2^k进制数

    题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. (3)将r转换为2进制数q后 ...

  3. [NOIP1999] 提高组 洛谷P1014 Cantor表

    题目描述 现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的.他是用下面这一张表来证明这一命题的: 1/1 1/2 1/3 1/4 1/5 - 2/1 2/2 2/3 2/4 - ...

  4. [NOIP2005] 提高组 洛谷P1051 谁拿了最多奖学金

    题目描述 某校的惯例是在每学期的期末考试之后发放奖学金.发放的奖学金共有五种,获取的条件各自不同: 1) 院士奖学金,每人8000元,期末平均成绩高于80分(>80),并且在本学期内发表1篇或1 ...

  5. [NOIP2012] 提高组 洛谷P1080 国王游戏

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...

  6. [NOIP1998] 提高组 洛谷P1011 车站

    题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...

  7. [NOIP2002] 提高组 洛谷P1031 均分纸牌

    题目描述 有 N 堆纸牌,编号分别为 1,2,-, N.每堆上有若干张,但纸牌总数必为 N 的倍数.可以在任一堆上取若于张纸牌,然后移动. 移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 ...

  8. [NOIP2001] 提高组 洛谷P1024 一元三次方程求解

    题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...

  9. [NOIP2015] 提高组 洛谷P2661 信息传递

    题目描述 有n个同学(编号为1到n)正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为i的同学的信息传递对象是编号为Ti同学. 游戏开始时,每人都只知道自己的生日.之后每一 ...

最新文章

  1. http 权威指南 目录
  2. Appointment detail page loading never ends in Zeiss
  3. 整合JDBC---SpringBoot
  4. ADO得到字段名的代码
  5. 基于JAVA+SpringBoot+Mybatis+MYSQL的工资管理系统
  6. 【转】Java多线程面试问题集锦
  7. Atitit.数据库新特性战略规划 mssql sql server 2008 SQL2012 SQL2014
  8. 『地铁交换机』地铁交换机作用
  9. Windows Defender
  10. 硬件设计之一——电源设计02:DCDC设计
  11. lol服务器稳定性补偿,lol游戏稳定性补偿皮肤领取
  12. 仿知乎悬浮功能按钮FloatingActionButton
  13. win10计算机左边栏,教你把win10任务栏透明设置
  14. 扑克牌自动图像识别在博彩行业的应用
  15. 动手练一练,手写一个价格对比、固定表头滚动的表格
  16. 深入联想隐藏分区 打造个性一键恢复
  17. 3*3矩阵键盘的实现
  18. 网管系统主流技术及其应用
  19. 如何实现点击div区域外隐藏div区域
  20. JDK自带的日志java.util.logging解析

热门文章

  1. redis集群安装和java应用
  2. SD卡FAT32文件系统格式
  3. PHP curl 模拟登录
  4. asp.net中关于点击页面一个控件,弹出框的制作
  5. boost库在工作(20)线程之五
  6. TP5 封装通用的微信服务类
  7. POJ2528线段树段更新逆序异或(广告牌)
  8. 【Android NDK 开发】Android NDK 下载 ( 下载指定历史版本 NDK | Android NDK r10e - 2015 年 5 月 )
  9. 【计算理论】计算理论总结 ( 上下文无关文法 CFG 转为下推自动机 PDA 示例 1 ) ★★
  10. PIE_SDK.NET功能表