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)\). 添加第一条边时,显然会形成一个环,而这条环上的所有边全部只需要走一遍.所以为了使添加的边的贡献最大化,我们 ...
随机推荐
- jquery刷新iframe页面的方法
1,reload 方法,该方法强迫浏览器刷新当前页面. 语法:location.reload([bForceGet]) 参数: bForceGet, 可选参数, 默认为 false,从客户端缓存里取当 ...
- 【bzoj1212】 [HNOI2004]L语言
题目描述 标点符号的出现晚于文字的出现,所以以前的语言都是没有标点的.现在你要处理的就是一段没有标点的文章. 一段文章T是由若干小写字母构成.一个单词W也是由若干小写字母构成.一个字典D是若干个单词的 ...
- mRemote配置
配置完mRemote后 备份C:\Users\Administrator\AppData\Local\Felix_Deimel\mRemote\confCons.xml文件 覆盖到其他电脑可以直接使用
- GPS定位,经纬度附近地点查询–C#实现方法
目前的工作是需要手机查找附近N米以内的商户,功能如下图 数据库中记录了商家在百度标注的经纬度(如:116.412007, 39.947545), 最初想法 以圆心点为中心点,对半径做循环,半径每增加 ...
- (一)问候Struts2
第一节:Struts2 简介 主页:http://struts.apache.org/在用户请求和模块化处理方面以及页面的展现这块,Struts2 发挥的屌炸天作用:相对于传统的Jsp+Servlet ...
- 原生JS实现幻灯片轮播效果
在以往的认知中,一直以为用原生JS写轮播是件很难得事情,今天上班仿照网上的写了一个小demo.小试牛刀. 大致效果: html结构很简单,两个列表,一个代表图片列表,一个是右下角序号列表. <d ...
- [转]setTimeout() 函数未定义错误
用 setTimeout("showMe()",1000) 时出现 showMe is not defined 错误.这是由于showMe() 函数不在 setTimeout 调用 ...
- ecshop 函数列表大全
lib_time.phpgmtime() P: 获得当前格林威治时间的时间戳 /$0server_timezone() P: 获得服务器的时区 /$0local_mktime($hour = NULL ...
- PHP实战开发教程
对于PHP初学者来说,一上手就学习庞大的PHP语法无疑很打击自信心.其实即便是很熟练的程序员,也未必对所有的语法非常熟悉.通常熟练的程序员比普通的程序员的优势在于对基本语法的理解非常透彻,而且常用的一 ...
- paramiko模块实现堡垒机
通过SSHClient 执行命令 """通过用户名密码验证""" import paramiko # 创建 SSH 对象 ssh = par ...