题目描述

题解

这一题,刚开始看题目感觉好像很难,题目又长……一看数据范围,呵呵。

已经给出来这是个DAG,所以不用担心连通性的问题。那么怎么做呢?

朴素的做法是把树的直径的两个端点都统计出来,然后暴力算那个什么偏心距,这里可以用floyd预处理,反正才n才300。还有一点,怎么算一个点到一条路径的距离呢,很简单,计算点到路径的距离,由于这是一张树网,且已经预处理点对之间的距离,从而点k到路径(i,j)的距离即为

 (dist[k][i]+dist[k][j]-dist[i][j])/ //可以画图理解一下,注意是没有环的。

然后就开始敲了,但后来发现好像不用管直径,只用枚举一条路径就行了(满足最优的路径一定在树的直径上)
时间复杂度嘛……O(n^3)
参考代码

 #include<bits/stdc++.h>
using namespace std;
const int inf=1e9;
const int N=;
int n,m,a[N][N],ans=inf,dis,u,v,c;
int main()
{
scanf("%d %d",&n,&m);
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
if(i-j)
a[i][j]=inf;
}
}
for(int i=;i<n;i++)
{
scanf("%d%d%d",&u,&v,&c);
a[u][v]=a[v][u]=c;
}
for(int k=;k<=n;k++)
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
a[i][j]=min(a[i][k]+a[k][j],a[i][j]);
}
}
for(int i=;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
if(a[i][j]<=m)
{
dis=;
for(int k=;k<=n;k++)
{
dis=max(dis,(a[k][i]+a[k][j]-a[i][j])/);
}
ans=min(dis,ans);
}
}
}
printf("%d",ans);
return ;
}

最新文章

  1. PHP 正则表达式 修饰符
  2. Mac下体验Hexo与Github Pages搭建
  3. (C# &amp; Unity) 脚本语言 ES
  4. angulaijs中的ng-upload-file与阿里云oss服务的结合,实现在浏览器端上传文件到阿里云(速度可以达到1.5M)
  5. udp通信的原理---makefile文件
  6. 妙用||和&amp;&amp;
  7. volatile适用场景
  8. jmeter测试手机app
  9. Java经典算法四十例编程详解+程序实例
  10. hive和hbase整合的原因和原理
  11. Ibatis的分页机制的缺陷
  12. 实现Ant Design 自定义表单组件
  13. 对#ifndef的理解
  14. kali linux 2.0 web 渗透测试 电子书
  15. jquery获取radio选中值及遍历
  16. Android为TV端助力 am命令以及hotkey文件的编写
  17. webform-AJAX
  18. 扩展方法 C#
  19. Android之udp传输
  20. 一款好用的取色工具TakeColor

热门文章

  1. Redis安装及局域网访问配置CentOS
  2. word写文档体会
  3. socket模块(套接字模块)
  4. 安卓之文本视图TextView及跑马灯效果
  5. 忘记SYS密码
  6. java.lang.ClassNotFoundException: javax.xml.bind.DatatypeConverter 可能是我们运行的java版本过高导致
  7. Linux - 软硬链接,hard link and symbolic link
  8. selenium 元素查找与属性
  9. 模块学习-json pickle
  10. 201771010135杨蓉庆 《面对对象程序设计(java)》第七周学习总结