题解:

显然需要分类讨论了,首先理解k==0即原图时按照dfs序来说 , 每条边至少走两次;

k==1,相当于可以省去dfs回溯时第二次走过某条路径的浪费,所以答案是k==0的答案-直径 ;

k==2,和k==1同理,答案是k==0时的答案-两条边不相交的链的最大和,先做一次直径,将直径上的边边权都赋值为取为相反数,再做一次直径即可;(应该边权不只有1也是适用的吧,注意第二次的边权有负值只能用dp求直径)      

 #include<bits/stdc++.h>
using namespace std;
const int N=;
int n,k,o=,hd[N],mx,mx1,mx2,s1[N],s2[N],dia;
struct Edge{int v,nt,w;}E[N<<];
void adde(int u,int v,int w){
E[o]=(Edge){v,hd[u],w};hd[u]=o++;
E[o]=(Edge){u,hd[v],w};hd[v]=o++;
}
int dfs(int u,int fa){
int mx1=,mx2=;
for(int i=hd[u];~i;i=E[i].nt){
int v=E[i].v;
if(v==fa)continue;
int w = E[i].w + dfs(v,u);
if(w>mx1)mx2=mx1,s2[u]=s1[u],mx1=w,s1[u]=i;
else if(w>mx2)mx2=w,s2[u]=i;
}
if(mx1+mx2>dia)mx=u,dia=mx1+mx2;
return mx1;
}
int main(){
freopen("bzoj1912.in","r",stdin);
freopen("bzoj1912.out","w",stdout);
scanf("%d%d",&n,&k);
memset(hd,-,sizeof(hd));
for(int i=,u,v;i<n;i++){
scanf("%d%d",&u,&v);
adde(u,v,);
}
int ans=(n-)<<;
dia=;dfs(,);
ans=ans-dia+;
if(k==){
for(int i=s1[mx];i;i=s1[E[i].v])E[i].w=E[i^].w=-;
for(int i=s2[mx];i;i=s1[E[i].v])E[i].w=E[i^].w=-;
dia=;dfs(,);
ans=ans-dia+;
}
printf("%d\n",ans);
return ;
}

bzoj1912

bzoj1912【Apio2010】patrol 巡逻的更多相关文章

  1. BZOJ1912 [Apio2010]patrol 巡逻

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

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

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

  3. BZOJ1912:[APIO2010]patrol巡逻

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

  4. 2018.11.06 bzoj1912: [Apio2010]patrol 巡逻(树形dp)

    传送门 一道挺妙的题啊. 对于K==1K==1K==1的直接求树的直径. 对于K==2K==2K==2的先求一次直径,然后考虑到如果两条边加进去形成的两个环重叠就会有负的贡献. 因此把之前那条直径上的 ...

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

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

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

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

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

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

  8. [Apio2010]patrol 巡逻

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

  9. 【bzoj1912】 Apio2010—patrol 巡逻

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

  10. P1912: [Apio2010]patrol 巡逻

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

随机推荐

  1. Codeforces Round #500 (Div. 2) D - Chemical table

    首先我们如果满足三缺一,那么必有同行和同列的点 如果两行有同列的数,我们可以设想,他们最后会全部填充成为两者啥都有的情况 显然这个是个并查集 现在我们有了很多集合,每个集合自己可以进行三缺一操作,但是 ...

  2. New begin

    Purpose 今天更换了id,希望重新沉淀. 晚上看到国外一个博客,落款有个中文: 敬惜字纸. 共勉.

  3. 7.hdfs工作流程及机制

    1. hdfs基本工作流程 1. hdfs初始化目录结构 hdfs namenode -format 只是初始化了namenode的工作目录 而datanode的工作目录是在datanode启动后自己 ...

  4. Python3 解压序列

    一 普遍情况: x,y,z = 1,2,3 print("x:",x) # x:1 print("y:",y) # y:2 print("z:&quo ...

  5. centos上搭建git服务--4

    Git是目前世界上最先进的分布式版本控制系统(没有之一).使用Svn的请参考<版本控制-svn服务器搭建和常用命令(centos 6.3)>,下面介绍Git的常用命令 常用命令 简单版 升 ...

  6. underscore.js源码解析(二)

    前几天我对underscore.js的整体结构做了分析,今天我将针对underscore封装的方法进行具体的分析,代码的一些解释都写在了注释里,那么废话不多说进入今天的正文. 没看过上一篇的可以猛戳这 ...

  7. Scrum立会报告+燃尽图(十月十七日总第八次):分配Alpha阶段任务

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2246 项目地址:https://git.coding.net/zhang ...

  8. 王者荣耀交流协会第一次Scrum立会

    工作照片: scrum master:高远博 时间跨度;2017/10/13 6:04-6:34 地点:一食堂二楼两张桌子旁 立会内容; 昨天的成绩;昨天商议了今天的开会的时间.地点 今天的计划;讨论 ...

  9. Java:类集框架中集合的学习

    Java:类集框架中集合的学习 集合 Java:Set的学习 Set是类集框架中的集合类.集合是不按特定的方式排序,并且没有重复对象的一种类. Q:Set如何操作?Set中的不按特定方式排序是怎么排序 ...

  10. 马士兵老师hadoop讲解总结博客地址记录(啊啊啊啊啊,自己没有保存写好的博客...)

    http://www.cnblogs.com/yucongblog/p/6650822.html