bzoj 3743 [Coci2015]Kamp——树形dp+换根
题目: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+换根相关推荐
- P4827-[国家集训队]Crash 的文明世界【树形dp,换根法,斯特林数】
正题 题目链接:https://www.luogu.com.cn/problem/P4827 题目大意 一颗nnn个点的树,定义dis(i,j)dis(i,j)dis(i,j)表示树上i,ji,ji, ...
- 『树形DP·换根法』Accumulation Degree
题目描述 有一个树形的水系,由 N-1 条河道和 N 个交叉点组成. 我们可以把交叉点看作树中的节点,编号为 1~N,河道则看作树中的无向边. 每条河道都有一个容量,连接 x 与 y 的河道的容量记为 ...
- [BZOJ3677/UOJ#105][APIO2014]Beads and wires 连珠线(树形dp+换根)
Address https://www.lydsy.com/JudgeOnline/problem.php?id=3677 http://uoj.ac/problem/105 Solution 考虑一 ...
- Educational Codeforces Round 67 (Rated for Div. 2)(D思维题 线段树/E树形dp(换根dp) 二次扫描与换根法)
心得 D写了个假算法被hack了wtcl- E据涛神说是二次扫描与换根法,看了看好像和树形dp差不多 F概率dp G费用流 回头再补 思路来源 马老师 归神 贤神等代码 http://www.mami ...
- P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】
正题 题目链接:https://www.luogu.com.cn/problem/P4284 题目大意 nnn个点的一棵树,每个点有pip_ipi概率通电,每个边有一定概率可以导电.求期望有电的节点 ...
- jzoj3844-统计损失【树形dp,换根法】
正题 题目链接:https://jzoj.net/senior/#main/show/3844 题目大意 一棵树,求每条路径的点权乘积之和. 解题思路 若只考虑从xxx出发往子树的路径,那么有fx=a ...
- 最大疯子树-树形dp+换根+二次扫描
分析: 疯子树肯定还是一棵树. 所以,所谓的最短路径就是吓唬你的,树上两点之间有且只有一条路径. b1和b2必须是相邻的,否则不可能是一棵疯子树. 再想一想,用同样的方式构造剩下的点的话,那么可以得到 ...
- [题解](树形dp/换根)小x游世界树
2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...
- 树形(dp+换根dp)
普通树形dp 树形dp通常围绕根节点来写状态转移方程 用一道基础的树形dp例题来具体分析: 没有上司的舞会 Ural 大学有 N 名职员,编号为 1∼N. 他们的关系就像一棵以校长为根的树,父节点就是 ...
最新文章
- 如何“快”、“准”、“狠”成为优秀算法工程师
- 1个人70万行代码,20年持续更新,这款游戏号称开发到死,永不停更
- 通宵加班、猝死频发,但仍建议你不要轻易买保险
- python实例32[简单的HttpServer]
- oracle数据泵导出csv文件,数据泵expdp导出遇到ORA-01555和ORA-22924问题的分析和处理...
- 在 Swift 语言中更好的处理 JSON 数据:SwiftyJSON
- MySQL循环语句之while循环测试
- re管理器java格式_正则表达式工具类——ReUtil
- STM8学习笔记---串口通信中如何自己定义通信协议
- python 字符串子串_Python字符串子字符串
- python坐标系教程_python Shapely使用指南详解
- (转) [it-ebooks]电子书列表
- java 摄像头_javacv调用摄像头拍照
- NOIP2012 模拟试题二 腾讯大战360
- matlab/simulink鼠标滚动设置成上下移动而不是缩放
- 解决Kali linux安装后无法使用键盘输入
- 计算机课教学日志,计算机教学研修日志.doc
- 概念肆虐:凭什么让“IPv9”横行无忌?
- 关于自定义View的drawText字体测量
- Netty 工作流程图梳理