2237: [NCPC2009]Flight Planning

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 55  Solved: 27
[Submit][Status][Discuss]

Description

S航空公司在N座城市之间有N-1条航线,航线是双向的。任意两座城市都是可以互相到达的,但是可能需要在一些城市换乘不同的航线。

目前有人抱怨要到达有些城市需要换乘太多次,S航空公司为了缓解这一现状,决定取消目前的一条航线,添加另一条航线,在保证任意两座城市还是可以互相到达的前提下,使得两座城市之间需要乘坐的航线次数的最大值最小。

Input

第一行为一个整数N(4<=N<=2500),表示城市的个数。城市从1到N编号。

接下来N-1行,每行是一对整数a和b,表示一条连接a和b的航线(1<=a,b<=N)。

Output

输出仅一行,即航空公司进行调整后,任意两座城市之间需要乘坐的航班次数的最大值。

Sample Input

4

1 2

2 3

3 4

Sample Output

2

【样例解释】

取消3-4的航线,添加2-4的航线。

HINT

对于100%的数据,N<=2500。

题意:在一棵树上,你可以任意删除一条边再加上一条并使得这个图还是颗树,在此前提下,你要让树的直径最小,求最小直径

n^2是可以接受的
枚举每一条边,把它断开,形成两个联通块,对这两个联通块求直径l1 l2
那么ans=min(ans,max(l1,l2,(l1+1)/2+(l2+1)/2+1))
简单说明一下后面那一坨:
对于两棵树,要把它们连起来后是直径最小,肯定是链接两颗树直径的中点
用反证法可以证明这样更优:假设选择另外的点链接,那么直径两端(a , b)到它的距离的max(disa,disb) 不会比到中点的距离短

  1. #include<cstdio>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define N 2505
  6. using namespace std;
  7. int n,tot=,l1,l2,hd[N],dis[N],x[N],y[N],ban[N<<];
  8. struct edge{int u,v,next;}e[N<<];
  9. void adde(int u,int v){
  10. e[++tot].v=v;
  11. e[tot].u=u;
  12. e[tot].next=hd[u];
  13. hd[u]=tot;
  14. }
  15. void dfs(int u,int fa){
  16. for(int i=hd[u];i;i=e[i].next){
  17. int v=e[i].v;
  18. if(v==fa||ban[i])continue;
  19. dis[v]=dis[u]+;
  20. dfs(v,u);
  21. }
  22. }
  23. int getlen(int x){
  24. int t1,t2;
  25. memset(dis,,sizeof(dis));
  26. dfs(x,);t1=x;
  27. for(int i=;i<=n;i++)
  28. if(dis[i]>dis[t1])t1=i;
  29. memset(dis,,sizeof(dis));
  30. dfs(t1,);t2=t1;
  31. for(int i=;i<=n;i++)
  32. if(dis[i]>dis[t2])t2=i;
  33. return dis[t2];
  34. }
  35. int main(){
  36. scanf("%d",&n);
  37. for(int i=;i<n;i++){
  38. int u,v;
  39. scanf("%d%d",&u,&v);
  40. adde(u,v);adde(v,u);
  41. }int ans=<<;
  42. for(int i=;i<=tot;i+=){
  43. ban[i]=ban[i^]=;
  44. l1=getlen(e[i].u);
  45. l2=getlen(e[i].v);
  46. ans=min(ans,max(l1,max(l2,(l1+)/+(l2+)/+)));
  47. ban[i]=ban[i^]=;
  48. }printf("%d",ans);
  49. return ;
  50. }

bzoj2237[NCPC2009]Flight Planning 结论题?的更多相关文章

  1. 【BZOJ】2237: [NCPC2009]Flight Planning

    题意 \(n(1 \le n \le 2500)\)个点的树,求删掉一条边再加上一条边使得还是一棵树,且任意两点最大距离最小. 分析 考虑枚举删掉每一条边,我们只需要考虑如何加边容易求得新树的最大距离 ...

  2. [codevs5578][咸鱼]tarjan/结论题

    5578 咸鱼  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 在广袤的正方形土地上有n条水平的河流和m条垂直的河流,发达的咸鱼家族在m*n个河流交叉点都 ...

  3. BZOJ_1367_[Baltic2004]sequence_结论题+可并堆

    BZOJ_1367_[Baltic2004]sequence_结论题+可并堆 Description Input Output 一个整数R Sample Input 7 9 4 8 20 14 15 ...

  4. [BZOJ3609][Heoi2014]人人尽说江南好 结论题

    Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家), 最近他 想起了小时候在江南玩过的一个游戏.     在过去,人们是要 ...

  5. 【uoj#282】长度测量鸡 结论题

    题目描述 给出一个长度为 $\frac{n(n+1)}2$ 的直尺,要在 $0$ 和 $\frac{n(n+1)}2$ 之间选择 $n-1$ 个刻度,使得 $1\sim \frac{n(n+1)}2$ ...

  6. 【uoj#175】新年的网警 结论题+Hash

    题目描述 给出一张 $n$ 个点 $m$ 条边的无向连通图,每条边的边权为1.对于每个点 $i$ ,问是否存在另一个点 $j$ ,使得对于任意一个不为 $i$ 或 $j$ 的点 $k$ ,$i$ 到 ...

  7. 【uoj#180】[UR #12]实验室外的攻防战 结论题+树状数组

    题目描述 给出两个长度为 $n$ 的排列 $A$ 和 $B$ ,如果 $A_i>A_{i+1}$ 则可以交换 $A_i$ 和 $A_{i+1}$ .问是否能将 $A$ 交换成 $B$ . 输入 ...

  8. 【bzoj4401】块的计数 结论题

    题目描述 给出一棵n个点的树,求有多少个si使得整棵树可以分为n/si个连通块. 输入 第一行一个正整数N,表示这棵树的结点总数,接下来N-1行,每行两个数字X,Y表示编号为X的结点与编号为Y的结点相 ...

  9. 【bzoj3997】[TJOI2015]组合数学 Dilworth定理结论题+dp

    题目描述 给出一个网格图,其中某些格子有财宝,每次从左上角出发,只能向下或右走.问至少走多少次才能将财宝捡完.此对此问题变形,假设每个格子中有好多财宝,而每一次经过一个格子至多只能捡走一块财宝,至少走 ...

随机推荐

  1. javabean 是什么?

    JavaBean规范 Bean的中文含义是“豆子”,顾名思义,JavaBean是指一段特殊的Java类, 就是有默然构造方法,只有get,set的方法的java类的对象. 专业点解释是: JavaBe ...

  2. Session的过期时间如何计算?

    在生成session的时候,会设置一个session过期时间.session的过期时间并不是从生成session对象开始计算,超过过期时间,session就失效了. 而是每当一个浏览器请求,sessi ...

  3. Binary Tree Xorder Traversal

     * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeN ...

  4. [知识梳理]课本1&2.1-2.5

    面向对象的语言 出发点:更直接地描述客观世界中存在的事物(对象)以及它们之间的关系. 特点: 是高级语言. 将客观事物看作具有属性和行为的对象. 通过抽象找出同一类对象的共同属性和行为,形成类. 通过 ...

  5. DBA 小记 — 分库分表、主从、读写分离

    前言 我在上篇博客 "Spring Boot 的实践与思考" 中比对不同规范的 ORM 框架应用场景的时候提到过主从与读写分离,本篇随笔将针对此和分库分表进行更深入地探讨. 1. ...

  6. Nokia大事录

    1994年,接通中国第一个GSM电话. 1995年,接通中国第一个无线数据电话. 1996年,接通中国第一个GSM1800网络电话.首家推出同时支持简繁中文短讯的移动电话--诺基亚8110.  199 ...

  7. 算法题丨Two Sum

    描述 Given an array of integers, return indices of the two numbers such that they add up to a specific ...

  8. JVM学习记录

    本博客是为了自己学习JVM而建立,只记录一些自己学习的经过. 最近在看<深入理解Java虚拟机>这本书,里面的内容,很是乏味,因为看不懂所以就会觉得很枯燥,觉得很枯燥看着看着就犯困,然后就 ...

  9. 【52ABP实战教程】0.2-- VSTS中的账号迁移到东亚

    需求从哪里来! VSTS的全称是Visual Studio Team Services. 在上一篇的文章中已经给大家说了VSTS之前是没有香港节点.大家的访问速度回比较慢.但是11月10号微软就宣布开 ...

  10. Android WebView那些坑之上传文件

    最近公司项目需要在WebView上调用手机系统相册来上传图片,开发过程中发现在很多机器上无法正常唤起系统相册来选择图片. 解决问题之前我们先来说说WebView上传文件的逻辑:当我们在Web页面上点击 ...