2018.09.28 bzoj3743: [Coci2015]Kamp(树形dp)
传送门
这是一道很有意思的题。
我们把所有的关键点都提出来,当成一棵有边权的虚树。
然后发现虚树上除最后不回到虚根的那条路径外外每条边都会被走两遍。
显然要让答案最优,不走的路径应该在虚树的直径上,于是我们dfs出虚树的直径。
注意对于不在虚树上的节点花费还需要多加dis(i,虚树)∗2dis(i,虚树)*2dis(i,虚树)∗2。
代码:
#include<bits/stdc++.h>
#define N 500005
#define ll long long
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
int n,k,first[N],siz[N],rt,cnt=0;
bool is[N];
ll d1[N],d2[N],sum=0;
struct edge{int v,next;ll w;}e[N<<1];
inline void add(int u,int v,ll w){e[++cnt].v=v,e[cnt].w=w,e[cnt].next=first[u],first[u]=cnt;}
inline void dfs1(int p,int fa){
siz[p]=is[p];
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
d1[v]=d1[p]+e[i].w;
if(is[v]&&d1[v]>d1[rt])rt=v;
dfs1(v,p);
if(siz[v])sum+=e[i].w;
siz[p]+=siz[v];
}
is[p]=(siz[p]!=0);
}
inline void dfs2(int p,int fa){
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
d1[v]=d1[p]+e[i].w;
if(is[v]&&d1[v]>d1[rt])rt=v;
dfs2(v,p);
}
}
inline void dfs3(int p,int fa){
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
d2[v]=d2[p]+e[i].w;
if(is[v]&&d2[v]>d2[rt])rt=v;
dfs3(v,p);
}
}
inline void dfs4(int p,int fa){
for(int i=first[p];i;i=e[i].next){
int v=e[i].v;
if(v==fa)continue;
d2[v]=(is[v]?0:d2[p]+e[i].w),dfs4(v,p);
}
}
int main(){
n=read(),k=read();
for(int i=1;i<n;++i){
int x=read(),y=read();
ll z=read();
add(x,y,z),add(y,x,z);
}
for(int i=1;i<=k;++i)is[rt=read()]=1;
dfs1(rt,0),memset(d1,0,sizeof(d1)),dfs2(rt,0),dfs3(rt,0);
for(int i=1;i<=n;++i)d1[i]=max(d1[i],d2[i]);
memset(d2,0,sizeof(d2)),dfs4(rt,0);
for(int i=1;i<=n;++i)printf("%lld\n",sum*2+d2[i]*2-d1[i]);
return 0;
}
2018.09.28 bzoj3743: [Coci2015]Kamp(树形dp)的更多相关文章
- 【BZOJ3743】[Coci2015]Kamp 树形DP
[BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举 ...
- 2018.09.06 警卫安排(树形dp)
描述 太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫. 皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状:有边直接相连的宫殿可以互相望见.大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全 ...
- bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...
- 2018.09.28 bzoj3688: 折线统计(dp+树状数组)
传送门 简单树状数组优化dp. 注意到k很小提示我们搜(d)(d)(d)索(p)(p)(p). 先按第一维排序. 用f[i][j][0/1]f[i][j][0/1]f[i][j][0/1]表示第i个点 ...
- bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2
3743: [Coci2015]Kamp Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 484 Solved: 229[Submit][Status ...
- 『kamp 树形dp』
kamp Description jz 市的云台山是个很美丽的景区,小 x 暑期到云台山打工,他的任务是开景区的大巴. 云台山景区有 N 个景点,这 N 个景点由 N-1 条道路连接而成,我们保证这 ...
- bzoj 3743 [ Coci 2015 ] Kamp —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的 ...
- [bzoj3743 Coci2015] Kamp(树形dp)
传送门 Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的 ...
- [Bzoj3743][Coci2015] Kamp【换根Dp】
Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...
随机推荐
- icil 参考docker
@All 有不知道怎么用docker发布项目的,请参考 http://192.168.18.224:8888/svn/Enterprise/site/docker/overview of docker ...
- JS实现拖动效果
有个问题就是该模块要使用定位,因为有left,top属性使用,绝对定位和相对定位都行,当然你也可使用margin-left,和margin-top这2个属性,替换left,top也是可以得 这样就不用 ...
- myeclipse 保存失败
Save FailedCompilation unit name must end with .java, or one of the registered Java-like extensions ...
- IE浏览器中的加载项怎么删除
IE浏览器中的加载项是一些软件或者浏览器的功能控件,我们可以通过禁用.开启来控制是否使用某些加载项,同时可以将一些加载项删除. 比如当我们遇到了一些不好的加载项,想要将它删除,通过这篇经验,教大家怎么 ...
- 机器学习入门-交叉验证选择参数(数据切分)train_test_split(under_x, under_y, test_size, random_state), (交叉验证的数据切分)KFold, recall_score(召回率)
1. train_test_split(under_x, under_y, test_size=0.3, random_state=0) # under_x, under_y 表示输入数据, tes ...
- github上关于iOS的各种开源项目集合(转)
UI 下拉刷新 EGOTableViewPullRefresh - 最早的下拉刷新控件. SVPullToRefresh - 下拉刷新控件. MJRefresh - 仅需一行代码就可以为UITable ...
- JAVA NIO学习记录1-buffer和channel
什么是NIO? Java NIO(New IO)是从Java 1.4版本开始引入的一个新的IO API,可以替代标准的Java IO API.NIO与原来的IO有同样的作用和目的,但是使用的方式完全不 ...
- UGUI Canvas
Render Mode Screen Space - Overlay 在此模式下不会参照到Camera,UI直接显示在任何对象之上 1.Pixel Perfect:可以使图像更清晰,但是有额外的性能开 ...
- Haskell语言学习笔记(69)Yesod
Yesod Yesod 是一个使用 Haskell 语言的 Web 框架. 安装 Yesod 首先更新 Haskell Platform 到最新版 (Yesod 依赖的库非常多,版本不一致的话很容易安 ...
- 奶牛易物小组 Alpha冲刺
项目地址:https://gitee.com/rrycbar/NenuChange 1 第一天 日期:2018/6/14 1.1 今日完成任务情况以及遇到的问题. 吴建瑜: 完成任务: 1.继续完善购 ...