首先树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. 修改linux的最大文件句柄数限制

                   在当前session有效,用户退出或者系统重新后恢复默认值       2)修改profile文件:在profile文件中添加:ulimit -n 65535      ...

  2. POJ 3259 Wormholes (判负环)

    Wormholes Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 46123 Accepted: 17033 Descripti ...

  3. Prism中使用MEF的例子

    一个基本的例子,没有viewmodel,没有使用Behaviors 大体步骤: 1.创建应用程序 2.使用"Shell"替换"MainWindow"(silve ...

  4. 基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--AOP编程

    AOP编程在目前来说好像是大家都比较喜欢的.ASP.NET MVC中的Filter就是使用AOP实现的配置器模式.AOP在编码中的应用主要有如下几个方面: 日志记录,跟踪,优化和监控 事务的处理 持久 ...

  5. MVC5 + EF6 + Bootstrap3 (15) 应用ModelState和Data Annotation做服务器端数据验证

    Slark.NET-博客园 http://www.cnblogs.com/slark/p/mvc5-ef6-bs3-get-started-server-side-validation.html 系列 ...

  6. ul、li模仿ios的TableView实现城市选择

    最近项目一个接着一个,之前说的精创环的项目还没做完,今天说先把那个放一下,先做访客系统,销售会见客户之后可以对客户进行一个跟踪记录,原型图也给了,今日头条的频道自定义页面一样. 如果是在IOS上让我来 ...

  7. GBPR: Group Preference Based Bayesian Personalized Ranking for One-Class Collaborative Filtering-IJACA 2013_20160421

    1.Information publication:IJACA 2013 2.What 基于BPR模型的改进:改变BPR模型中,a,用户对商品喜好偏序对之间相互独立;b,用户之间相互独立的假设 原因: ...

  8. IOS自学

    初识IOS 开发工具:xcode , 第一步学习c 打开xcode 新建一个object #include<stdio.h>//引入一个库,支持pringf输出功能 /* this is ...

  9. [转]Windows系统注册表知识完全揭密

    来源:http://www.jb51.net/article/3328.htm Windows注册表是帮助Windows控制硬件.软件.用户环境和Windows界面的一套数据文件,注册表包含在Wind ...

  10. Keepalived+Redis高可用部署

    1   Redis简介及安装 Redis是一个开源,先进的key-value存储,并用于构建高性能,可扩展的Web应用程序的完美解决方案. Redis从它的许多竞争继承来的三个主要特点: Redis数 ...