【BZOJ】【1912】【APIO2010】patrol巡逻
树形DP
说是树形DP,其实就是求树的最长链嘛……
K=1的时候明显是将树的最长链的两端连起来最优。
但是K=2的时候怎么搞?
考虑第一次找完树的最长链以后的影响:第一次找过的边如果第二次再走,对答案的贡献会变成-1,因为两次都选这一段的话,反而会使得这一段不得不走两次(如果只被选一次的话就可以只走一次),所以就将第一次找出的树的最长链上的边权值都改为-1。这个操作可以用链表实现(类比一下最小费用最大流的spfa实现!)
题解:http://blog.csdn.net/qpswwww/article/details/43935861
/**************************************************************
Problem: 1912
User: Tunix
Language: C++
Result: Accepted
Time:580 ms
Memory:5752 kb
****************************************************************/ //BZOJ 1912
#include<vector>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#define rep(i,n) for(int i=0;i<n;++i)
#define F(i,j,n) for(int i=j;i<=n;++i)
#define D(i,j,n) for(int i=j;i>=n;--i)
#define pb push_back
#define CC(a,b) memset(a,b,sizeof(a))
using namespace std;
inline int getint(){
int v=,sign=; char ch=getchar();
while(ch<''||ch>''){ if (ch=='-') sign=-; ch=getchar();}
while(ch>=''&&ch<=''){ v=v*+ch-''; ch=getchar();}
return v*sign;
}
const int N=1e5+,INF=~0u>>;
typedef long long LL;
/******************tamplate*********************/
int head[N],to[N<<],next[N<<],len[N<<],cnt=;
void add(int x,int y){
to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt; len[cnt]=;
to[++cnt]=x; next[cnt]=head[y]; head[y]=cnt; len[cnt]=;
}
int n,K;
int D,S,son1[N],son2[N];
int dfs(int x,int fa){
int m1=,m2=;
for(int i=head[x];i;i=next[i])
if (to[i]!=fa){
int nowh=dfs(to[i],x)+len[i];
if (nowh>m1){m2=m1;m1=nowh;son2[x]=son1[x];son1[x]=i;}
else if (nowh>m2){m2=nowh; son2[x]=i;}
}
if (D<m1+m2) D=m1+m2,S=x;
return m1;
}
int main(){
#ifndef ONLINE_JUDGE
freopen("1912.in","r",stdin);
freopen("1912.out","w",stdout);
#endif
n=getint(); K=getint();
F(i,,n){
int x=getint(),y=getint();
add(x,y);
}
int ans=(n-)<<;
D=;
CC(son1,-);
CC(son2,-);
dfs(,-);
ans-=D-;
if (K>){
D=;
for(int i=son1[S];i!=-;i=son1[to[i]]) len[i]=len[i^]=-;
for(int i=son2[S];i!=-;i=son1[to[i]]) len[i]=len[i^]=-;
CC(son1,-);
CC(son2,-);
dfs(,-);
ans-=D-;
}
printf("%d\n",ans);
return ;
}
1912: [Apio2010]patrol 巡逻
Time Limit: 4 Sec Memory Limit: 64 MB
Submit: 642 Solved: 362
[Submit][Status][Discuss]
Description

Input
表示村庄a与b之间有一条道路(1 ≤ a, b ≤ n)。
Output
Sample Input
1 2
3 1
3 4
5 3
7 5
8 5
5 6
Sample Output
HINT
10%的数据中,n ≤ 1000, K = 1;
30%的数据中,K = 1;
80%的数据中,每个村庄相邻的村庄数不超过 25;
90%的数据中,每个村庄相邻的村庄数不超过 150;
100%的数据中,3 ≤ n ≤ 100,000, 1 ≤ K ≤ 2。
Source
【BZOJ】【1912】【APIO2010】patrol巡逻的更多相关文章
- BZOJ 1912: [Apio2010]patrol 巡逻 (树的直径)(详解)
题目: https://www.lydsy.com/JudgeOnline/problem.php?id=1912 题解: 首先,显然当不加边的时候,遍历一棵树每条边都要经过两次.那么现在考虑k==1 ...
- bzoj 1912 : [Apio2010]patrol 巡逻 树的直径
题目链接 如果k==1, 显然就是直径. k==2的时候, 把直径的边权变为-1, 然后在求一次直径. 变为-1是因为如果在走一次这条边, 答案会增加1. 学到了新的求直径的方法... #includ ...
- bzoj 1912: [Apio2010]patrol 巡逻【不是dp是枚举+堆】
我是智障系列.用了及其麻烦的方法= =其实树形sp就能解决 设直径长度+1为len(环长) 首先k=1,直接连直径两端就好,答案是2*n-len 然后对于k=2,正常人的做法是树形dp:先求直径,然后 ...
- bzoj 1912: [Apio2010]patrol 巡逻
呵呵呵呵呵呵,自己画图,大概半个小时,觉的连上边会成环(是不是该交仙人掌了??)然后求环不重合部分最大就好了, 结果写了一坨DP,最后写不下去了,再次扒了题解. 发现我真的是个sb. k==1,直接是 ...
- 【BZOJ】1912: [Apio2010]patrol 巡逻(树的直径)
题目 传送门:QWQ 分析 $ k=1 $ 时显然就是树的直径 $ k=2 $ 时怎么做呢? 做法是把一开始树的直径上的边的边权改成$ -1 $,那么当我们第二次用这些边做环时就抵消了一开始的贡献. ...
- BZOJ 1912:[Apio2010]patrol 巡逻(树直径)
1912: [Apio2010]patrol 巡逻 Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示村庄a与b之间有一条道路(1 ≤ ...
- [Apio2010]patrol 巡逻
1912: [Apio2010]patrol 巡逻 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2541 Solved: 1288[Submit][S ...
- 【BZOJ1912】[Apio2010]patrol 巡逻 树形DP
[BZOJ1912][Apio2010]patrol 巡逻 Description Input 第一行包含两个整数 n, K(1 ≤ K ≤ 2).接下来 n – 1行,每行两个整数 a, b, 表示 ...
- 【bzoj1912】 Apio2010—patrol 巡逻
http://www.lydsy.com/JudgeOnline/problem.php?id=1912 (题目链接) 题意 给出一棵树,要求在树上添加K(1 or 2)条边,添加的边必须经过一次,使 ...
- BZOJ1912 [Apio2010]patrol 巡逻
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
随机推荐
- mariadb日志学习笔记
MySQL日志: 查询日志:query log 慢查询日志: 查询执行时长超过指定时长的查询操作所记录的日志 slow query log 错误日志:包含了服务器启动和关闭的正常信息 二进制日志:包含 ...
- spark streaming kafka1.4.1中的低阶api createDirectStream使用总结
转载:http://blog.csdn.net/ligt0610/article/details/47311771 由于目前每天需要从kafka中消费20亿条左右的消息,集群压力有点大,会导致job不 ...
- 2013-10-25笔记,css: mini-width, 标准居中,样式中*号使用,背景图像位置定位
mini-width:设置元素的最小宽度.該屬性值會對元素的寬度設置一個最小限制.因此,元素可以比制定值寬,但不能比制定值窄.不允許指定負值. 完美的居中佈局: body{text-align: ce ...
- 为你的Windows7设置动态壁纸
From:http://www.cnblogs.com/killerlegend/p/3644014.html By KillerLegend DreamScene是Vista上的一个功能,可以让你设 ...
- java作用域public ,private ,protected 及不写时的区别(转)
在说明这四个关键字之前,我想就class之间的关系做一个简单的定 义,对于继承自己的class,base class可以认为他们都是自己的子 女,而对于和自己一个目录下的classes,认为都是自己的 ...
- 开机一会,出现长时间闪屏,并且跳出SendRpt error
通过谷歌,发现任务管理器中的Report sending utility 是属于TortoiseSVN 的,所以卸载svn ,然后重启就ok了
- SRF之数据字典
框架提供数据字典的配置和显示的功能 字典以编码作为标识,用varchar(50)类型保存字典的编码. 字典的用法 1.在代码里边需要查询字典信息的 可用 Components.DataDict ...
- 【Inno Setup】 Inno Setup 64位安装程序默认安装路径
在脚本中加入: ArchitecturesInstallIn64BitMode=x64 ArchitecturesAllowed=x64
- 对 cloudwu 简单的 cstring 进行简单解析
题外话 以前也用C写过字符串,主要应用的领域是,大字符串,文件读取方面.写的很粗暴,用的凑合着.那时候看见云风前辈的一个开源的 cstring 串. 当时简单观摩了一下,觉得挺好的.也没细看.过了较长 ...
- hdu 5142 NPY and FFT
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5142 NPY and FFT Description A boy named NPY is learn ...