由于k只有2,所以我们分类讨论
显然当k=1时,我们只要连一条最长的路径即可就是树的直径L
少走了L-1条边
如果k=2时,我们再次连边成环后
如果成环路径与上一次的最长路径没有相同的边,那少走的边数是路径长l-1
如果有相同的边,那么相同的边一共还是会走两次,少走的边数是l-1-2*same
因此我们只要把第一次找的的最长路径上的边标记为-1,再做一次树形dp即可

 type node=record
po,len,next:longint;
end; var w:array[..] of node;
f,p1,p2,p:array[..] of longint;
v:array[..] of boolean;
i,ans,loc,maxx,t,n,k,x,y:longint; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; procedure add(x,y:longint);
begin
inc(t);
w[t].po:=y;
w[t].len:=;
w[t].next:=p[x];
p[x]:=t;
end; procedure dfs(x:longint);
var i,y,s1,s2:longint;
begin
i:=p[x];
v[x]:=true;
s1:=;
s2:=;
while i<>- do
begin
y:=w[i].po;
if not v[y] then
begin
dfs(y);
if f[y]+w[i].len>s1 then
begin
s2:=s1;
p2[x]:=p1[x];
s1:=f[y]+w[i].len;
p1[x]:=i;
end
else if (s2<f[y]+w[i].len) then
begin
s2:=f[y]+w[i].len;
p2[x]:=i;
end;
end;
i:=w[i].next;
end;
// writeln(x,' ',s1,' ',s2);
f[x]:=s1;
if maxx<s1+s2 then
begin
maxx:=s1+s2;
loc:=x;
end;
end; begin
t:=-;
fillchar(p,sizeof(p),);
fillchar(p1,sizeof(p1),);
fillchar(p2,sizeof(p2),);
readln(n,k);
for i:= to n- do
begin
readln(x,y);
add(x,y);
add(y,x);
end;
dfs();
ans:=*(n-)-maxx+;
if k= then
begin
maxx:=;
w[p1[loc]].len:=-;
w[p2[loc]].len:=-;
x:=w[p1[loc]].po;
while p1[x]<>- do
begin
w[p1[x]].len:=-;
x:=w[p1[x]].po;
end;
x:=w[p2[loc]].po;
while p1[x]<>- do
begin
w[p1[x]].len:=-;
x:=w[p1[x]].po;
end;
fillchar(v,sizeof(v),false);
fillchar(f,sizeof(f),);
dfs();
ans:=ans-maxx+;
end;
writeln(ans);
end.

bzoj1912的更多相关文章

  1. 【bzoj1912】 Apio2010—patrol 巡逻

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

  2. 直径上的乱搞 bzoj1999求树直径上的结点+单调队列,bzoj1912负权树求直径+求直径边

    直径上的乱搞一般要求出这条直径上的点集或者边集 bzoj1999:对直径上的点集进行操作 /* 给出一颗树,在树的直径上截取长度不超过s的路径 定义点u到s的距离为u到s的最短路径长度 定义s的偏心距 ...

  3. bzoj1912【Apio2010】patrol 巡逻

    题解: 显然需要分类讨论了,首先理解k==0即原图时按照dfs序来说 , 每条边至少走两次: k==1,相当于可以省去dfs回溯时第二次走过某条路径的浪费,所以答案是k==0的答案-直径 : k==2 ...

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

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

  5. BZOJ1912 最长链树形DP

    每次求出最长链更新答案后要将最长链上的边权改为-1 写的贼长 还可以优化... /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) mem ...

  6. 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)

    1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 1034  Solved: 562[Submit][St ...

  7. BZOJ1912 [Apio2010]patrol 巡逻

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

  8. bzoj1912 树形dp求直径(新写法),求直径的两端点

    通过回溯法可以求出直径的两个端点,同时注意有负权边的树求直径不可以用两次dfs来求,而必须用dp做 /* 分情况讨论问题 一条边也不加的情况,显然每条边要扫描两次, 该情况的答案是2(n-1) 只加一 ...

  9. BZOJ1912或洛谷3629 [APIO2010]巡逻

    一道树的直径 BZOJ原题链接 洛谷原题链接 显然在原图上路线的总长为\(2(n-1)\). 添加第一条边时,显然会形成一个环,而这条环上的所有边全部只需要走一遍.所以为了使添加的边的贡献最大化,我们 ...

随机推荐

  1. CentOS 6.7安装Hadoop 2.6.3集群环境

    在CentOS 6.7 x64上搭建Hadoop 2.6.3完全分布式环境,并在DigitalOcean上测试成功. 本文假设: 主节点(NameNode)域名(主机名):m.fredlab.org ...

  2. 在DropDownList里显示多级分类

    protected void ddlBind() { DataTable dt = new DataTable(); ddlCategoryId.DataSource = getList(" ...

  3. css3中允许单词内断句word-wrap和怎么处理断句word-break

    首先说一下:浏览器的默认行为,在一行中几个单词 排列着,如果最后一个长单词 太长时 首先是移到下一行,如果该单词的长度大于父元素的宽度,会溢出. <!doctype html> <h ...

  4. MyBatis的学习总结五:调用存储过程【参考】

    一.创建存储过程 存储过程的目的:统计edi_test_task 正在运行的任务和非运行的任务 CREATE DEFINER=`root`@`%` PROCEDURE `edihelper`.`SP_ ...

  5. iOS,长按图片保存实现方法,轻松搞定!

    1.添加手势识别: UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@s ...

  6. win7下装ubuntu

    需要的东西有: 1,ubuntu系统镜像,下载地址:http://www.ubuntu.com/download/desktop 选64位吧,兼容性好些. 2,空闲的大于20G硬盘空间,这个大小根据个 ...

  7. 如何在本地安装测试ECSHOP 转载

    如何在本地安装测试ECSHOP 如何在本地(自己的电脑)上先安装ECShop 一.创建PHP环境 1.下载AppServ 因为ECShop在线网上商店系统是用PHP语言开发的,所以,在本地架设网店之前 ...

  8. iOS 异常汇总

    reason: 'invalid nib registered for identifier (cell) - nib must contain exactly one top level objec ...

  9. sublime 正则搜索日语字符

    sublime 正则搜索日语字符 [\x{3041}-\x{3096}\x{30A0}-\x{30FF}\x{3400}-\x{4DB5}\x{4E00}-\x{9FCB}\x{F900}-\x{FA ...

  10. 开发错误日志之IllegalArgumentException:MALFORMED

    java.lang.IllegalArgumentException: MALFORMED 上面存在中文问题是因为java.util.zip下的格式转换有问题 ,jdk中的zip存在字符编码的问题. ...