Description

Input

第一行包含两个整数 n, K(1 ≤ K ≤ 2)。接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, b ≤ n)。

Output

输出一个整数,表示新建了K 条道路后能达到的最小巡逻距离。

Sample Input

8 1
1 2
3 1
3 4
5 3
7 5
8 5
5 6

Sample Output

11

HINT

10%的数据中,n ≤ 1000, K = 1; 
30%的数据中,K = 1; 
80%的数据中,每个村庄相邻的村庄数不超过 25; 
90%的数据中,每个村庄相邻的村庄数不超过 150; 
100%的数据中,3 ≤ n ≤ 100,000, 1 ≤ K ≤ 2。

首先对于k=1的数据,yy一下就可以发现要找树的直径,然而对于k=2的点,相当于找两条直径,但是会发现,如果这两条直径重复了会很蛋疼,还是会重复走到,因此我们找完第一个直径后,直径上面的边全部赋值为-1,然后再找第二条直径。
 
  1. #include<algorithm>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<iostream>
  6. int tot,go[],first[],next[];
  7. int op[];
  8. int vis[],dis[],c[],from[],pre[];
  9. int d[],n,k,ans,Mx2,val[];
  10. void insert(int x,int y,int z){
  11. tot++;
  12. go[tot]=y;
  13. next[tot]=first[x];
  14. first[x]=tot;
  15. val[tot]=z;
  16. }
  17. void add(int x,int y,int z){
  18. insert(x,y,z);op[tot]=tot+;
  19. insert(y,x,z);op[tot]=tot-;
  20. }
  21. void bfs(int x){
  22. int h=,t=;
  23. for (int i=;i<=n;i++) pre[i]=from[i]=;
  24. for (int i=;i<=n;i++) vis[i]=,dis[i]=;
  25. c[]=x;vis[x]=;dis[x]=;
  26. while (h<=t){
  27. h++;
  28. for (int i=first[c[h]];i;i=next[i]){
  29. int pur=go[i];
  30. if (vis[pur]) continue;
  31. pre[pur]=c[h];
  32. from[pur]=i;
  33. vis[pur]=;c[++t]=pur;dis[pur]=dis[c[h]]+val[i];
  34. }
  35. }
  36. }
  37. void pianfen1(){
  38. bfs();
  39. int mx=;
  40. for (int i=;i<=n;i++) if (dis[i]>dis[mx]) mx=i;
  41. bfs(mx);
  42. Mx2=;
  43. for (int i=;i<=n;i++) if (dis[Mx2]<dis[i]) Mx2=i;
  44. if (k==) printf("%d\n",*(n-)-dis[Mx2]+);
  45. }
  46. void dfs(int x){
  47. d[x]=,vis[x]=;int mx1=,mx2=;
  48. for (int i=first[x];i;i=next[i]){
  49. int pur=go[i];
  50. if (vis[pur]) continue;
  51. dfs(pur);
  52. if (d[pur]+val[i]>mx1) mx2=mx1,mx1=d[pur]+val[i];
  53. else
  54. if (d[pur]+val[i]>mx2) mx2=d[pur]+val[i];
  55. }
  56. if (mx1+mx2>ans) ans=mx1+mx2;
  57. d[x]=mx1;
  58. }
  59. int main(){
  60. scanf("%d%d",&n,&k);
  61. for (int i=;i<n;i++){
  62. int x,y;
  63. scanf("%d%d",&x,&y);
  64. add(x,y,);
  65. }
  66. pianfen1();
  67. int cnt=*(n-)-dis[Mx2]+;
  68. if (k==) return ;
  69. for (int i=;i<=n;i++) vis[i]=,d[i]=0x3f3f3f3f;
  70. for (int i=Mx2;i!=;i=pre[i]) val[from[i]]=-,val[op[from[i]]]=-;
  71. ans=;
  72. dfs();
  73.  
  74. printf("%d\n",cnt-ans+);
  75. }

bzoj 1912 巡逻(树直径)的更多相关文章

  1. BZOJ 1912 巡逻(算竞进阶习题)

    树的直径 这题如果k=1很简单,就是在树的最长链上加个环,这样就最大化的减少重复的路程 但是k=2的时候需要考虑两个环的重叠部分,如果没有重叠部分,则和k=1的情况是一样的,但是假如有重叠部分,我们可 ...

  2. BZOJ 1912(树的直径+LCA)

    题面 传送门 分析 显然,如果不加边,每条边都要走2次,总答案为2(n-1) 考虑k=1的朴素情况: 加一条边(a,b),这条边和树上a->b的路径形成一个环,这个环上的边只需要走一遍,所以答案 ...

  3. BZOJ 1912 巡逻

    重赋边权. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm& ...

  4. HDU 4607 Park Visit 两次DFS求树直径

    两次DFS求树直径方法见 这里. 这里的直径是指最长链包含的节点个数,而上一题是指最长链的路径权值之和,注意区分. K <= R: ans = K − 1; K > R:   ans = ...

  5. [HDOJ2196]Computer (树直径, 树DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 给一棵树,求树上各点到某点的距离中最长的距离.注意每个点都要求. 和普通求树的直径不一样,要求每 ...

  6. [HDOJ4612]Warm up(双连通分量,缩点,树直径)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 所有图论题都要往树上考虑 题意:给一张图,仅允许添加一条边,问能干掉的最多条桥有多少. 必须解决 ...

  7. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  8. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  9. CodeForces 455C Civilization(并查集+树直径)

    好久没有写过图论的东西了,居然双向边要开两倍空间都忘了,不过数组越界cf居然给我报MLE??这个题题意特别纠结,一开始一直不懂添加的边长是多长... 题意:给你一些点,然后给一些边,注意没有重边 环, ...

随机推荐

  1. LeetCode_Generate Parentheses

    Given n pairs of parentheses, write a function to generate all combinations of well-formed parenthes ...

  2. NSIS检测操作系统x64还是x86的问题。

    想共同维护一个NSIS脚本文件的,不想搞两个版本的脚本文件了.开始想到了!if语句,没试过,不知道行不行得通.后来google了一下.可以用两个头文件搞定.参照下面链接 Reference: http ...

  3. /sbin/ifup: configuration for eth0 not found解决

    /sbin/ifup: configuration for eth0 not found. Usage: ifup <device name> 那么应该是在/etc/sysconfig/n ...

  4. MVC4.0 Controller和View重复加载

    项目完成以后总是感觉有一些页面跑起来特别的慢,就仔细的调试了下,发现有很多也买年都是走了两遍,页面加载的时候Controller和View会连续走了两次,没有一点缘由 查了很久也不知道什么原因,这个问 ...

  5. NOI2013 树的计数

    题目:http://uoj.ac/problem/122 85%做法: 动态规划. 首先重编号,BFS序变成1...n,然后DFS序相应重编号. 记pos[i]为i号点在DFS中的位置,即pos[d[ ...

  6. J2EE学习路线

    第一部分:  JAVA语言基础知识.包括异常.IO流.多线程.集合类.数据库.(切记基础知识一定要时时刻刻巩固,注意,如果你是想以最快速度学习J2EE,关于Java中的Swing知识点,就只做了解)  ...

  7. 第30讲 UI组件之 GridView组件

    第30讲 UI组件之 GridView组件 1.网格布局组件GridView GridView是一个ViewGroup(布局控件),可使用表格的方式显示组件,可滚动的控件.一般用于显示多张图片,比如实 ...

  8. ASIHttpRequest:创建队列、下载请求、断点续传、解压缩

    ps:本文转载自网络:http://ryan.easymorse.com/?p=12 感谢作者 工程完整代码下载地址:RequestTestDownload1 可完成: 下载指定链接的zip压缩文件 ...

  9. 程序员的家!我终于拥有自己的blog了!!!

    经过多次提交诚恳的家园申请,终于得到了审核通过!今天就开始了我的.net成长之路!!!

  10. (转)C#之玩转反射

    前言 之所以要写这篇关于C#反射的随笔,起因有两个:   第一个是自己开发的网站需要用到   其次就是没看到这方面比较好的文章. 所以下定决心自己写一篇,废话不多说开始进入正题. 前期准备 在VS20 ...