BZOJ3743 : [Coci2014]Kamp
d[x][0]表示x点向下走且回到x点的最少代价
d[x][1]表示x点向下走但不回到x点的最少代价
d[x][2]表示x点向下走的最长路
d[x][3]表示x点向下走的次长路
u[x][0]表示x点向上走且回到x点的最少代价
u[x][1]表示x点向上走但不回到x点的最少代价
一遍树形DP即可
ans[i]=min(d[i][0]+u[i][1],d[i][1]+u[i][0])
#include<cstdio>
#define N 500010
typedef long long ll;
int n,k,i,j,x,y,z,g[N],nxt[N<<1],v[N<<1],w[N<<1],ed,f[N],dis[N],h,t,q[N],size[N],de[N];
ll d[N][4],u[N][2],tmp;
bool is[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline void add(int x,int y,int z){v[++ed]=y;w[ed]=z;nxt[ed]=g[x];g[x]=ed;}
inline ll min(ll x,ll y){return x<y?x:y;}
int main(){
read(n),read(k);
for(i=1;i<n;i++)read(x),read(y),read(z),add(x,y,z),add(y,x,z);
while(k--)read(x),is[x]=1;
q[h=t=1]=1;
while(h<=t)for(j=g[x=q[h++]];j;j=nxt[j])if(v[j]!=f[x])f[q[++t]=v[j]]=x,dis[v[j]]=w[j];
for(i=n;i;i--){
size[x=q[i]]=is[x];
for(j=g[x];j;j=nxt[j])if(v[j]!=f[x]&&size[v[j]]){
size[x]+=size[v[j]];
d[x][0]+=d[v[j]][0]+2LL*w[j];
tmp=d[v[j]][1]-d[v[j]][0]-w[j];
if(tmp<d[x][2])d[x][3]=d[x][2],d[x][2]=tmp,de[x]=v[j];else d[x][3]=min(d[x][3],tmp);
}
d[x][1]=d[x][0]+d[x][2];
}
for(i=2;i<=n;i++)if(size[1]>size[x=q[i]]){
u[x][0]=u[f[x]][0]+d[f[x]][0]-d[x][0];
u[x][1]=u[f[x]][1]+d[f[x]][0];
if(de[f[x]]==x)u[x][1]=min(u[x][1],u[f[x]][0]+d[f[x]][0]+d[f[x]][3]);
else u[x][1]=min(u[x][1],u[f[x]][0]+d[f[x]][1]);
u[x][1]-=d[x][0]+dis[x];
if(!size[x])u[x][0]+=2*dis[x],u[x][1]+=2*dis[x];
}
for(i=1;i<=n;i++)printf("%lld\n",min(d[i][0]+u[i][1],d[i][1]+u[i][0]));
return 0;
}
BZOJ3743 : [Coci2014]Kamp的更多相关文章
- [Bzoj3743][Coci2015] Kamp【换根Dp】
Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...
- bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2
3743: [Coci2015]Kamp Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 484 Solved: 229[Submit][Status ...
- bzoj3743: [Coci2015]Kamp
首先树dp求出一个点的答案 然后再一遍dfs换根(是叫做换根吗.. 详见代码 #include <iostream> #include <cstdio> #include &l ...
- 2018.09.28 bzoj3743: [Coci2015]Kamp(树形dp)
传送门 这是一道很有意思的题. 我们把所有的关键点都提出来,当成一棵有边权的虚树. 然后发现虚树上除最后不回到虚根的那条路径外外每条边都会被走两遍. 显然要让答案最优,不走的路径应该在虚树的直径上,于 ...
- [bzoj3743 Coci2015] Kamp(树形dp)
传送门 Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的 ...
- 树形dp专题总结
树形dp专题总结 大力dp的练习与晋升 原题均可以在网址上找到 技巧总结 1.换根大法 2.状态定义应只考虑考虑影响的关系 3.数据结构与dp的合理结合(T11) 4.抽直径解决求最长链的许多类问题( ...
- 【BZOJ3743】[Coci2015]Kamp 树形DP
[BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举 ...
- bzoj3743 Kamp
Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发 ...
- BZOJ3743 COCI2015Kamp(树形dp)
设f[i]为由i开始遍历完子树内所要求的点的最短时间,g[i]为由i开始遍历完子树内所要求的点最后回到i的最短时间.则g[i]=Σ(g[j]+2),f[i]=min{g[i]-g[j]+f[j]-1} ...
随机推荐
- 【UER #1】[UOJ#12]猜数 [UOJ#13]跳蚤OS [UOJ#14]DZY Loves Graph
[UOJ#12][UER #1]猜数 试题描述 这一天,小Y.小D.小C正在愉快地玩耍. 小Y是个数学家,他一拍脑袋冒出了一个神奇的完全平方数 n. 小D是个机灵鬼,很快从小Y嘴里套出了 n的值.然后 ...
- BNUOJ 1037 精神控制
XsuagrX喜欢到处唬人,各种唬.这不,经过刻苦修炼,他终于掌握了Bane Element的Ultra绝技加强版,恶魔掌控(快捷键F)(YY中&……).当XsugarX对某个人胡言乱语Q@# ...
- zookeeper 用法和日常运维
本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...
- PHP网页数据正则采集
$url ="https://********"; $contents = file_get_contents($url); //抓取页面数据 //如果出现中文乱码使用下面代码 / ...
- HAST 使用笔记
1.环境 2台 freebsd 9.2的机器,/home分区为260G,需要将其转为hast块设备 2.安装 (1)先umount /home,然后注释掉/etc/fstab上的/home记录: # ...
- Cocos2d-JS坐标系统
标准屏幕坐标系 如果接触过iOS,Android,Windows Phone等系统的应用开发,或使用DOM,CSS开发过Web网页,开发者会非常熟悉所谓的标准屏幕坐标系:左上角为原点,向右为X轴正方向 ...
- HDU1568斐波那契推理
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- JDK JRE 区别
JDK 包含了编译器,比如让.java编译成.classs文件. JRE =Java Runtime Environment j是一些比如一些split函数需要的包,都在里面,基本的运行环境都在JR ...
- Android实现监测网络状态
本文主要用到了安卓监测网络状态变化功能,实现了WIFI,3G,无网络状态切换时发出通知的功能. 主要知识点 service broadcast 接口回调实现 service的基本知识 service可 ...
- .net学习笔记----会话状态Session
一.会话状态Session Session用于服务器端状态管理,使用Session之后,每个客户端都可以将实际的数据保存在服务器上,对于每个客户端的数据,将会生成一个对应的唯一的key(保存在客户端) ...