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条边,求出在原树上的k条路径;若其无重复边,则优化长度为路径长度和;若有重复,则重复部分不被优化,优化的部分也可以表示为两条不重复路径。
问题变成了在树上求k条边不重复路径,使总距离最长。
若k=1,则该路径为树的直径;
若k=2,可以证明,两条路径只有两种可能:
1.一条为直径,一条与直径无重复。
2.两条都与直径有重复。
这样,只要先求一次直径,将直径上的边权值赋为-1,再求一次直径,将结果相加即可。
 
代码:
 type
point=^node;
node=record
x,v:longint; next:point;
end;
var
a:array[..]of point;
f1,f2,s1,s2:array[..]of longint;
n,i,m,max,k,x,y,ans:longint; p:point;
procedure ss(x,e:longint);
var p:point;
y:longint;
begin
s1[x]:=x; s2[x]:=x;
new(p); p:=a[x];
while p<>nil do
begin
y:=p^.x;
if y=e then begin p:=p^.next; continue; end;
ss(y,x);
if f1[y]+p^.v>f1[x] then
begin
f2[x]:=f1[x]; s2[x]:=s1[x];
f1[x]:=f1[y]+p^.v; s1[x]:=y;
end else
if f1[y]+p^.v>f2[x] then
begin
f2[x]:=f1[y]+p^.v; s2[x]:=y;
end;
p:=p^.next;
end;
if f1[x]+f2[x]>f1[max]+f2[max] then
max:=x;
end;
procedure add(x,y:longint);
var p:point;
begin
new(p); p^.x:=y; p^.v:=; p^.next:=a[x]; a[x]:=p;
end;
procedure qq(x:longint);
var
p:point;
y:longint;
begin
new(p); p:=a[x];
while p<>nil do
begin
y:=p^.x;
if y=s1[x] then begin p^.v:=-; qq(y); break; end;
p:=p^.next;
end;
end;
begin
readln(n,k);
for i:= to n- do
begin
readln(x,y); add(x,y); add(y,x);
end;
ans:=*(n-); max:=; f1[]:=; f2[]:=;
ss(,);
ans:=ans-f1[max]-f2[max]+;
if k= then writeln(ans) else
begin
fillchar(f1,sizeof(f1),);
fillchar(f2,sizeof(f2),);
new(p); p:=a[max];
while p<>nil do
begin
y:=p^.x;
if (y=s1[max])or(y=s2[max]) then p^.v:=-;
p:=p^.next;
end;
qq(s1[max]); qq(s2[max]); max:=;
ss(,);
ans:=ans-f1[max]-f2[max]+;
writeln(ans);
end;
end.

最新文章

  1. Winform布局方式
  2. 学习ios【2】Objective-C 数字和字符串
  3. debug不过的程序
  4. 2 NFS高可用解决方案之NFS的搭建
  5. Ubuntu下安装php7后无法启动Apache
  6. LeetCode131:Palindrome Partitioning
  7. Coursera台大机器学习技法课程笔记02-Dual Support Vector Machine
  8. ognl el表达式 property
  9. Ionic 安装部署
  10. linux命令中 rpm –qa|grep softname的含义
  11. sublime text3 安装package control
  12. jquery列表动画
  13. 工作中的第一份LoadRunner脚本
  14. css一长串连续英文字符的换行
  15. python学习笔记 python实现k-means聚类
  16. c#抽取pdf文档标题(4)——机器学习以及决策树
  17. OpenShift实战(三):OpenShift持久化存储Redis
  18. 移动端适配问题px-&gt;rem方法
  19. 135、JS和Android交互范例
  20. 第一条:了解Objective-C语言的起源

热门文章

  1. React:JS中的this和箭头函数
  2. capserjs-prototype(下)
  3. 2018-8-10-win10-uwp-如何让一个集合按照需要的顺序进行排序
  4. YARN框架与MapReduce1.0框架的对比分析
  5. JQuery,JS图片操作(上一张,下一张,旋转,放大,缩小)
  6. Redis本地集群搭建(5版本以上)
  7. code+第四次网络赛div2
  8. AOP-面向切面编程-1
  9. 【JZOJ6275】小L的数列
  10. python 基本常用数据类型