bzoj1912
由于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的更多相关文章
- 【bzoj1912】 Apio2010—patrol 巡逻
http://www.lydsy.com/JudgeOnline/problem.php?id=1912 (题目链接) 题意 给出一棵树,要求在树上添加K(1 or 2)条边,添加的边必须经过一次,使 ...
- 直径上的乱搞 bzoj1999求树直径上的结点+单调队列,bzoj1912负权树求直径+求直径边
直径上的乱搞一般要求出这条直径上的点集或者边集 bzoj1999:对直径上的点集进行操作 /* 给出一颗树,在树的直径上截取长度不超过s的路径 定义点u到s的距离为u到s的最短路径长度 定义s的偏心距 ...
- bzoj1912【Apio2010】patrol 巡逻
题解: 显然需要分类讨论了,首先理解k==0即原图时按照dfs序来说 , 每条边至少走两次: k==1,相当于可以省去dfs回溯时第二次走过某条路径的浪费,所以答案是k==0的答案-直径 : k==2 ...
- 【BZOJ1912】[Apio2010]patrol 巡逻 树形DP
[BZOJ1912][Apio2010]patrol 巡逻 Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示 ...
- BZOJ1912 最长链树形DP
每次求出最长链更新答案后要将最长链上的边权改为-1 写的贼长 还可以优化... /*Huyyt*/ #include<bits/stdc++.h> #define mem(a,b) mem ...
- 【BZOJ-1912】patrol巡逻 树的直径 + DFS(树形DP)
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 1034 Solved: 562[Submit][St ...
- BZOJ1912 [Apio2010]patrol 巡逻
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- bzoj1912 树形dp求直径(新写法),求直径的两端点
通过回溯法可以求出直径的两个端点,同时注意有负权边的树求直径不可以用两次dfs来求,而必须用dp做 /* 分情况讨论问题 一条边也不加的情况,显然每条边要扫描两次, 该情况的答案是2(n-1) 只加一 ...
- BZOJ1912或洛谷3629 [APIO2010]巡逻
一道树的直径 BZOJ原题链接 洛谷原题链接 显然在原图上路线的总长为\(2(n-1)\). 添加第一条边时,显然会形成一个环,而这条环上的所有边全部只需要走一遍.所以为了使添加的边的贡献最大化,我们 ...
随机推荐
- 如何打包成jar包自己看呢?
第一步:选择你要导出的部分 第二步:
- 在C#中实现Socket端口复用
转载:http://www.csharpwin.com/csharpspace/68.shtml 一.什么是端口复用: 因为在winsock的实现中,对于服务器的绑定是可以多重绑定的,在 ...
- Mac Zip命令
mac终端命令 zip -[parameter] [yourName].zip someFileOrDiectory -q 表示不显示压缩进度状态 -r 表示子目录子文件全部压缩为zip //这部比较 ...
- 【转】怎样创建一个Xcode插件(Part 1)
原文:How To Create an Xcode Plugin: Part 1/3 原作者:Derek Selander 译者:@yohunl 译者注:原文使用的是xcode6.3.2,我翻译的 ...
- cocos2dx系列笔记(2)- windows环境配置后续之 Android环境配置
续上篇 对于想用cocos2dx来开发Android游戏的人来说,最痛苦的莫过于配置Android环境和之后的奇奇怪怪的编译失败问题.这是经历了多次成功与失败之后,血与泪的经验包,大家请收好.如果你有 ...
- java 反射取得方法入参类型的泛形
package TestReflectClass; import java.util.List; /** * Created by wangyang on 2016/12/16. */ public ...
- hdoj(3790) 最短路径
最短路径问题 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
- boost::xml————又一次失败的尝试
尝试使用wptree来进行xml解析,又一次失败了,可以正常读取正常输出,但是使用wptree进行节点读取失败(乱码) 请看源码: DealXml.h #pragma once #include &l ...
- Cocos2dx边学边总结——开篇(一)
Cocos2dx是一个很好的开源跨平台2d游戏引擎,我们都知道他底层是基于OpenGl ES的,OpenGl 是跨平台的. 正是得益于这点 Cocos2dx的显示部分可以很好的跨平台运作,笔者认为 未 ...
- 【BZOJ1875】【矩阵乘法】[SDOI2009]HH去散步
Description HH有个一成不变的习惯,喜欢饭后百步走.所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离. 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回. 又因 ...