首先树dp求出一个点的答案

然后再一遍dfs换根(是叫做换根吗..

详见代码

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define ll long long
#define N 500005
#define M 1000006 using namespace std;
inline int read(){
int ret=0;char ch=getchar();
while (ch<'0'||ch>'9') ch=getchar();
while ('0'<=ch&&ch<='9'){
ret=ret*10-48+ch;
ch=getchar();
}
return ret;
} struct edge{
int adj,next,len;
edge(){}
edge(int _adj,int _next,int _len):adj(_adj),next(_next),len(_len){}
} e[M];
int n,g[N],m;
void AddEdge(int w,int u,int v){
e[++m]=edge(v,g[u],w);g[u]=m;
e[++m]=edge(u,g[v],w);g[v]=m;
} ll f[N],h[N],t[N],t0[N];
ll f0[N],h0[N];
int size[N],l[N];
int size0[N];
bool vis[N];
void dfs(int u){
vis[u]=1;
f[u]=l[u];h[u]=2*l[u];t[u]=0;t0[u]=0;
for (int i=g[u];i;i=e[i].next){
int v=e[i].adj;
if (vis[v]) continue;
l[v]=e[i].len;
dfs(v);
f[u]+=h[v];
h[u]+=h[v];
t0[u]=max(t0[u],h[v]-f[v]);
if (t0[u]>t[u]) swap(t0[u],t[u]);
size[u]+=size[v];
}
if (!size[u]) f[u]=h[u]=0;
else f[u]-=t[u];
vis[u]=0;
} ll ans[N];
void solve(int u){
vis[u]=1; f[u]=l[u];h[u]=2*l[u];t[u]=0;t0[u]=0;
for (int i=g[u];i;i=e[i].next){
int v=e[i].adj;
l[v]=e[i].len;
f[u]+=h[v];
h[u]+=h[v];
t0[u]=max(t0[u],h[v]-f[v]);
if (t0[u]>t[u]) swap(t0[u],t[u]);
size[u]+=size[v];
}
if (!size[u]) f[u]=h[u]=0;
else f[u]-=t[u]; ans[u]=f[u];
f0[u]=f[u];h0[u]=h[u];
size0[u]=size[u];
for (int i=g[u];i;i=e[i].next){
int v=e[i].adj;
if (vis[v]) continue;
swap(l[u],l[v]);
if ((size[u]-=size[v])){
h[u]+=(ll)2*l[u]-h[v];
f[u]+=(ll)l[u]-h[v];
if (h[v]-f[v]==t[u]) f[u]+=t[u]-t0[u];
}
else f[u]=h[u]=0; solve(v); f[u]=f0[u];h[u]=h0[u];
size[u]=size0[u];
swap(l[u],l[v]);
}
vis[u]=0;
} int main(){
n=read();int men=read();
for (int i=1;i<n;++i) AddEdge(read(),read(),read());
memset(size,0,sizeof(size));
while (men--) ++size[read()];
memset(vis,0,sizeof(vis));
l[1]=0;
dfs(1);
solve(1);
for (int i=1;i<=n;++i) printf("%lld\n",ans[i]);
return 0;
}

  

bzoj3743: [Coci2015]Kamp的更多相关文章

  1. bzoj3743 [Coci2015]Kamp 常州模拟赛d6t2

    3743: [Coci2015]Kamp Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 484  Solved: 229[Submit][Status ...

  2. [Bzoj3743][Coci2015] Kamp【换根Dp】

    Online Judge:Bzoj3743 Label:换根Dp,维护最长/次长链 题目描述 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的 ...

  3. 2018.09.28 bzoj3743: [Coci2015]Kamp(树形dp)

    传送门 这是一道很有意思的题. 我们把所有的关键点都提出来,当成一棵有边权的虚树. 然后发现虚树上除最后不回到虚根的那条路径外外每条边都会被走两遍. 显然要让答案最优,不走的路径应该在虚树的直径上,于 ...

  4. [bzoj3743 Coci2015] Kamp(树形dp)

    传送门 Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的 ...

  5. 【BZOJ3743】[Coci2015]Kamp 树形DP

    [BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举 ...

  6. [Coci2015]Kamp

    Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举行聚会. 聚会结束后需要一辆车从举行聚会的这点出发 ...

  7. 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点 ...

  8. bzoj 3743: [Coci2015]Kamp【树形dp】

    两遍dfs一遍向下,一边向上,分别记录子树内人数a,当前点到所有点的距离b,最大值c和次大值d,最大值子树p 然后答案是2b-c #include<iostream> #include&l ...

  9. bzoj 3743 [Coci2015]Kamp——树形dp+换根

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 树形dp+换根. “从根出发又回到根” 减去 “mx ” . 注意dfsx里真的要改那 ...

随机推荐

  1. HTML5网站如何做到完全不需要jQuery

    jQuery是现在最流行的JavaScript工具库. 据统计,目前全世界57.3%的网站使用它.也就是说,10个网站里面,有6个使用jQuery.如果只考察使用工具库的网站,这个比例就会上升到惊人的 ...

  2. Oracle Delete inner的方式,级联删除子表的数据方式。

    例子1: from table2 b where a.id=b.id) 例子2: rebatepolicy表是主表,rebatepolicyitems是从表,从表有主表的主键,现在对于主表一些条件的数 ...

  3. P3376 【模板】网络最大流

    P3376 [模板]网络最大流 题目描述 如题,给出一个网络图,以及其源点和汇点,求出其网络最大流. 输入输出格式 输入格式: 第一行包含四个正整数N.M.S.T,分别表示点的个数.有向边的个数.源点 ...

  4. AngularJS中的过滤器

    欢迎大家指导与讨论 : ) 一.前言 AngularJS的过滤器能够将数据在被指令处理到显示在视图之前进行处理和转换.而且,过滤器不会修改作用域中的数据本身,即过滤器会保证数据的完整性.这样子能够允许 ...

  5. AngularJS中的身份验证

    欢迎大家指导与讨论 : )  一.  身份验证的意义  首先呢,网络应用的身份验证的意图在于:保护网站中的重要资源.基于某些原因这些资源并不能公开,比如付费资源(交过钱的用户才能上的网络课程),或者一 ...

  6. Cordova - 使用Cordova开发iOS应用实战5(获取手机里照片,并编辑)

    使用Cordova可以很方便的通过js代码读取系统相簿里面的照片,同使用设备摄像头拍照一样,同样需要先添加camera插件. 一,添加camera插件 首先我们要在“终端”中进入工程所在的目录,然后运 ...

  7. 完成卸载vs2010后再安装

    在安装好vs2010后,更改了驱动器号,造成vs工具不能使用,所以需要卸载vs2010 使用Microsoft Visual Studio 2010 Uninstall Utility来卸载vs201 ...

  8. C#以post方式调用struts rest-plugin service的问题

    struts2: 玩转 rest-plugin一文中,学习了用struts2开发restful service的方法,发现用c#以post方式调用时各种报错,但java.ajax,包括firefox ...

  9. Wabpack系列:在webpack+vue开发环境中使用echarts导致编译文件过大怎么办?

    现象,在一个webpack+vue的开发环境中,npm install echarts --save了echarts,然后在vue文件中直接使用 import echarts from 'echart ...

  10. C8051逆向电阻屏:头儿拍脑袋说电阻屏IC好赚钱3块钱成本能卖20几块。,一个月不分昼夜逆向成功后头儿说电阻屏已经被市场淘汰请放弃治疗。

    参考: 书籍,<圈圈教你玩USB>  C8051F单片机快速入门:http://www.waveshare.net/Left_Column/C8051F_Application_Notes ...