这道题讨论了好久,一直想不明白,如果按传统的随便某一个点出发找最长链,再回头,K=2 的时候赋了-1就没法用这种方法找最长链了,于是乎,更强的找最长链的方法就来了。。类似于DP的东西吧。先上代码:

  1. const maxn=;
  2. type
  3. node=record
  4. f,t,l:longint;
  5. end;
  6. var n,k,i,j,ans,num,f,t,diameter,s,sum:longint;
  7. b:array[..*maxn] of node;
  8. head,go1,go2:array[..maxn] of longint;
  9. procedure swap(var a,b:longint);
  10. var tem:longint;
  11. begin
  12. tem:=a; a:=b; b:=tem;
  13. end;
  14. procedure insert(num,f,t:longint);
  15. begin
  16. b[num].f:=head[f];
  17. b[num].t:=t;
  18. b[num].l:=;
  19. head[f]:=num;
  20. end;
  21. function dfs(x,f:longint):longint;
  22. var nowe,max1,max2,tem:longint;
  23. begin
  24. max1:=; max2:=; //tem:=0;
  25. nowe:=head[x];
  26. while nowe<> do
  27. begin
  28. if b[nowe].t=f then
  29. begin
  30. nowe:=b[nowe].f;
  31. continue;
  32. end;
  33. tem:=dfs(b[nowe].t,x)+b[nowe].l;
  34. if tem>max1 then begin
  35. go2[x]:=go1[x];
  36. go1[x]:=nowe;
  37. max2:=max1;
  38. max1:=tem;
  39. end
  40. else if tem>max2 then
  41. begin
  42. go2[x]:=nowe;
  43. max2:=tem;
  44. end;
  45. nowe:=b[nowe].f;
  46. end;
  47. if diameter<max1+max2 then
  48. begin
  49. diameter:=max1+max2;
  50. s:=x;
  51. end;
  52. exit(max1);
  53. end;
  54. begin
  55. readln(n,k);
  56. for i:= to n- do
  57. begin
  58. readln(f,t);
  59. insert(i*-,f,t);
  60. insert(i*,t,f);
  61. end;
  62. ans:=*(n-);
  63. diameter:=;
  64. sum:=dfs(,);
  65. ans:=ans-diameter+;
  66. if k> then
  67. begin
  68. diameter:=;
  69. i:=go1[s];
  70. while i<> do
  71. begin
  72. b[i].l:=-;
  73. i:=go1[b[i].t];
  74. end;
  75. i:=go2[s];
  76. while i<> do
  77. begin
  78. b[i].l:=-;
  79. i:=go1[b[i].t];
  80. end;
  81. t:=dfs(,);
  82. ans:=ans-diameter+;
  83. end;
  84. writeln(ans);
  85. end.
  1. int diameter,s; //树的直径为diameter,直径的起点是s
  2. int son1[MAXV],son2[MAXV]; //记录最长路与次长路的路径
  3.  
  4. int DFS(int u,int fa)
  5. {
  6. int max1=,max2=; //与当前点相连的最长路与次长路 之和为不过fa的最长链,或者与fa相连并 //加上与fa相连边权值,作为连接fa可能的max1 或 max2
  7. for(int p=head[u];p!=-;p=edges[p].next)
  8. {
  9. int v=edges[p].v;
  10. if(v==fa) continue; //一直往下走,直到叶子节点
  11. int nowh=DFS(v,u)+edges[p].w;
  12. if(nowh>max1) max2=max1,son2[u]=son1[u],max1=nowh,son1[u]=p;
  13. else if(nowh>max2) max2=nowh,son2[u]=p;
  14. }
  15. if(diameter<max1+max2) diameter=max1+max2,s=u;
  16. return max1;
  17. }

而复杂度也是 O(n)的。

(转载请注明出处:http://www.cnblogs.com/Kalenda/)

P1912: [Apio2010]patrol 巡逻的更多相关文章

  1. 【BZOJ1912】[Apio2010]patrol 巡逻 树形DP

    [BZOJ1912][Apio2010]patrol 巡逻 Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示 ...

  2. BZOJ 1912:[Apio2010]patrol 巡逻(树直径)

    1912: [Apio2010]patrol 巡逻 Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ ...

  3. [Apio2010]patrol 巡逻

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2541  Solved: 1288[Submit][S ...

  4. BZOJ1912 [Apio2010]patrol 巡逻

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  5. 【树形dp 最长链】bzoj1912: [Apio2010]patrol 巡逻

    富有思维性的树形dp Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ a, ...

  6. BZOJ1912:[APIO2010]patrol巡逻

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

  7. 【bzoj1912】 Apio2010—patrol 巡逻

    http://www.lydsy.com/JudgeOnline/problem.php?id=1912 (题目链接) 题意 给出一棵树,要求在树上添加K(1 or 2)条边,添加的边必须经过一次,使 ...

  8. bzoj 1912 : [Apio2010]patrol 巡逻 树的直径

    题目链接 如果k==1, 显然就是直径. k==2的时候, 把直径的边权变为-1, 然后在求一次直径. 变为-1是因为如果在走一次这条边, 答案会增加1. 学到了新的求直径的方法... #includ ...

  9. BZOJ 1912: [Apio2010]patrol 巡逻 (树的直径)(详解)

    题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1912 题解: 首先,显然当不加边的时候,遍历一棵树每条边都要经过两次.那么现在考虑k==1 ...

随机推荐

  1. VS2013连接不上TFS,TF31002记录

    之前vs2013连接好好的,昨天就发现不行,类似如下错误 可能原因及解决办法: 1:C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG 下的 Ma ...

  2. js获得浏览器的尺寸

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  3. css规范大全

    一.文件规范 1.文件均归档至约定的目录中 所有的CSS分为两大类:通用类和业务类.通用的CSS文件,放在如下目录中: 基本样式库 /css/core 通用UI元素样式库 /css/lib JS组件相 ...

  4. linux 下wifi 功能的实现

    一.嵌入式linux四件套配置 1.网卡选型的依据: a.网卡不能乱选,否则没戏.网卡的依据是,kernel的menuconfig -> device drivers -> network ...

  5. 获取本地ip地址

    #import <ifaddrs.h> #import <arpa/inet.h> // Get IP Address - (NSString *)getIPAddress { ...

  6. activiti搭建(四)八项服务介绍

    转载请注明源地址:http://www.cnblogs.com/lighten/p/5927949.html 1.前言 之前学习的时候一直在其它文章看到activiti提供了七个接口来操作工作流,但在 ...

  7. NSLog的使用

    1.NSLog会将字符串打印在两个地方:操作系统的控制台和IDE的控制台. 2.对于NSLog来说,它打印的一个目的地并非控制台,而是系统文件“system.log”. 它另一个输出的目的地并非IED ...

  8. jquery easyui combobox

    $("#select_Dic").combobox({                        url: "http://www.cnblogs.com/Ajax/ ...

  9. 两种会话状态之Session会话

    什么是Session 使用Cookie和附加URL参数都可以将上一次请求的状态信息传递到下一次请求中,但是如果传递的状态信息较多,将极大降低网络传输效率和增大服务器端程序处理的难度. Session技 ...

  10. VPS centos 6 安装图形界面

    在某种场合之下,我们使用的Linux还是要选择安装桌面环境的,所以在这里介绍一下如何给没有安装桌面环境的系统安装桌面环境.以Centos 6.5 为例演示一下如何安装桌面环境. 工具/原料 Linux ...