题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743

树形dp+换根。 “从根出发又回到根” 减去 “mx ” 。

注意dfsx里真的要改那些dp[cr],为了下一层的调用。而且还要改回来!为了其他孩子下一层的调用!

注意dfsx里真的要改那些dp[v],为了下一层的调用。而且还要改回来!为了本层的继续调用!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=5e5+5;
int n,m,hd[N],xnt,num[N];
ll mx[N],dp[N],ans[N];
bool b[N];
struct Ed{int nxt,to,w;Ed(int n=0,int t=0,int w=0):nxt(n),to(t),w(w) {}
}ed[N<<1];
void add(int x,int y,int z)
{ed[++xnt]=Ed(hd[x],y,z);hd[x]=xnt;ed[++xnt]=Ed(hd[y],x,z);hd[y]=xnt;
}
void updt(int cr,int v,int i)
{if(num[v]){num[cr]+=num[v];dp[cr]+=dp[v]+(ed[i].w<<1);mx[cr]=max(mx[cr],mx[v]+ed[i].w);}
}
void dfs(int cr,int f)
{if(b[cr])num[cr]=1;for(int i=hd[cr],v;i;i=ed[i].nxt)if((v=ed[i].to)!=f){dfs(v,cr);updt(cr,v,i);}
}
void dfsx(int cr,int f)
{int ynm=num[cr];ll ymx=mx[cr],ydp=dp[cr];for(int i=hd[cr],v;i;i=ed[i].nxt)if((v=ed[i].to)!=f){dp[cr]=ydp;mx[cr]=ymx;num[cr]=ynm;int tnm=num[v];ll tmx=mx[v],tdp=dp[v];if(num[v]){num[cr]-=num[v];dp[cr]-=dp[v]+(ed[i].w<<1);}mx[cr]=0;for(int j=hd[cr],u;j;j=ed[j].nxt)if((u=ed[j].to)!=v&&num[u])mx[cr]=max(mx[cr],mx[u]+ed[j].w);updt(v,cr,i);ans[v]=dp[v]-mx[v];dfsx(v,cr);num[v]=tnm;mx[v]=tmx;dp[v]=tdp;}
}
int main()
{scanf("%d%d",&n,&m);int x,y,z;for(int i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);add(x,y,z);}for(int i=1;i<=m;i++)scanf("%d",&x),b[x]=1;dfs(1,0);ans[1]=dp[1]-mx[1];dfsx(1,0);for(int i=1;i<=n;i++)printf("%lld\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/9367063.html

bzoj 3743 [Coci2015]Kamp——树形dp+换根相关推荐

  1. P4827-[国家集训队]Crash 的文明世界【树形dp,换根法,斯特林数】

    正题 题目链接:https://www.luogu.com.cn/problem/P4827 题目大意 一颗nnn个点的树,定义dis(i,j)dis(i,j)dis(i,j)表示树上i,ji,ji, ...

  2. 『树形DP·换根法』Accumulation Degree

    题目描述 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 ...

  3. [BZOJ3677/UOJ#105][APIO2014]Beads and wires 连珠线(树形dp+换根)

    Address https://www.lydsy.com/JudgeOnline/problem.php?id=3677 http://uoj.ac/problem/105 Solution 考虑一 ...

  4. Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)

    心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...

  5. P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】

    正题 题目链接:https://www.luogu.com.cn/problem/P4284 题目大意 nnn个点的一棵树,每个点有pip_ipi​概率通电,每个边有一定概率可以导电.求期望有电的节点 ...

  6. jzoj3844-统计损失【树形dp,换根法】

    正题 题目链接:https://jzoj.net/senior/#main/show/3844 题目大意 一棵树,求每条路径的点权乘积之和. 解题思路 若只考虑从xxx出发往子树的路径,那么有fx=a ...

  7. 最大疯子树-树形dp+换根+二次扫描

    分析: 疯子树肯定还是一棵树. 所以,所谓的最短路径就是吓唬你的,树上两点之间有且只有一条路径. b1和b2必须是相邻的,否则不可能是一棵疯子树. 再想一想,用同样的方式构造剩下的点的话,那么可以得到 ...

  8. [题解](树形dp/换根)小x游世界树

    2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...

  9. 树形(dp+换根dp)

    普通树形dp 树形dp通常围绕根节点来写状态转移方程 用一道基础的树形dp例题来具体分析: 没有上司的舞会 Ural 大学有 N 名职员,编号为 1∼N. 他们的关系就像一棵以校长为根的树,父节点就是 ...

最新文章

  1. 如何“快”、“准”、“狠”成为优秀算法工程师
  2. 1个人70万行代码,20年持续更新,这款游戏号称开发到死,永不停更
  3. 通宵加班、猝死频发,但仍建议你不要轻易买保险
  4. python实例32[简单的HttpServer]
  5. oracle数据泵导出csv文件,数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理...
  6. 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON
  7. MySQL循环语句之while循环测试
  8. re管理器java格式_正则表达式工具类——ReUtil
  9. STM8学习笔记---串口通信中如何自己定义通信协议
  10. python 字符串子串_Python字符串子字符串
  11. python坐标系教程_python Shapely使用指南详解
  12. (转) [it-ebooks]电子书列表
  13. java 摄像头_javacv调用摄像头拍照
  14. NOIP2012 模拟试题二 腾讯大战360
  15. matlab/simulink鼠标滚动设置成上下移动而不是缩放
  16. 解决Kali linux安装后无法使用键盘输入
  17. 计算机课教学日志,计算机教学研修日志.doc
  18. 概念肆虐:凭什么让“IPv9”横行无忌?
  19. 关于自定义View的drawText字体测量
  20. Netty 工作流程图梳理

热门文章

  1. 人工智能的本质是最优化过程
  2. 华为将开源挑战 Oracle 的 AI 原生数据库 GaussDB
  3. 一套图 搞懂“时间复杂度”
  4. 【风之语】至贱城市之苏州
  5. Python中的凝聚层次聚类示例
  6. Python正则表达式常用的15个符号整理
  7. 也谈SAP业务顾问如何避免被ABAP开发顾问怒打
  8. 科普丨让机器看见世界,这背后的技术是什么?
  9. 干货丨入门机器学习,从搞懂这8大经典算法开始
  10. 神经网络原来是这样和数学挂钩的