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+;
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=,int t=,int w=):nxt(n),to(t),w(w) {}
}ed[N<<];
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<<);
mx[cr]=max(mx[cr],mx[v]+ed[i].w);
}
}
void dfs(int cr,int f)
{
if(b[cr])num[cr]=;
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<<);
}
mx[cr]=;
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=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
}
for(int i=;i<=m;i++)
scanf("%d",&x),b[x]=;
dfs(,);
ans[]=dp[]-mx[];
dfsx(,);
for(int i=;i<=n;i++)printf("%lld\n",ans[i]);
return ;
}
bzoj 3743 [Coci2015]Kamp——树形dp+换根的更多相关文章
- 【BZOJ3743】[Coci2015]Kamp 树形DP
[BZOJ3743][Coci2015]Kamp Description 一颗树n个点,n-1条边,经过每条边都要花费一定的时间,任意两个点都是联通的. 有K个人(分布在K个不同的点)要集中到一个点举 ...
- 树形dp换根,求切断任意边形成的两个子树的直径——hdu6686
换根dp就是先任取一点为根,预处理出一些信息,然后在第二次dfs过程中进行状态的转移处理 本题难点在于任意割断一条边,求出剩下两棵子树的直径: 设割断的边为(u,v),设down[v]为以v为根的子树 ...
- poj3585 Accumulation Degree(树形dp,换根)
题意: 给你一棵n个顶点的树,有n-1条边,每一条边有一个容量z,表示x点到y点最多能通过z容量的水. 你可以任意选择一个点,然后从这个点倒水,然后水会经过一些边流到叶节点从而流出.问你最多你能倒多少 ...
- poj3585 Accumulation Degree[树形DP换根]
思路其实非常简单,借用一下最大流求法即可...默认以1为根时,$f[x]$表示以$x$为根的子树最大流.转移的话分两种情况,一种由叶子转移,一种由正常孩子转移,判断一下即可.换根的时候由頂向下递推转移 ...
- [题解](树形dp/换根)小x游世界树
2. 小x游世界树 (yggdrasi.pas/c/cpp) [问题描述] 小x得到了一个(不可靠的)小道消息,传说中的神岛阿瓦隆在格陵兰海的某处,据说那里埋藏着亚瑟王的宝藏,这引起了小x的好奇,但当 ...
- bzoj 3743: [Coci2015]Kamp【树形dp】
两遍dfs一遍向下,一边向上,分别记录子树内人数a,当前点到所有点的距离b,最大值c和次大值d,最大值子树p 然后答案是2b-c #include<iostream> #include&l ...
- bzoj 1131 [POI2008]Sta 树形dp 转移根模板题
[POI2008]Sta Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1889 Solved: 729[Submit][Status][Discu ...
- Bzoj 1131[POI2008]STA-Station (树形DP)
Bzoj 1131[POI2008]STA-Station (树形DP) 状态: 设\(f[i]\)为以\(i\)为根的深度之和,然后考虑从他父亲转移. 发现儿子的深度及其自己的深度\(-1\) 其余 ...
- bzoj 3743 [ Coci 2015 ] Kamp —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3743 一开始想到了树形DP,处理一下子树中的最小值,向上的最小值,以及子树中的最长路和向上的 ...
随机推荐
- 使用openSUSE Leap 42.2小记
闪存记录 在2017年04月10日开始想用openSuSE. 2017年04月10日开始找资料制作U盘安装openSUSE. 是在windows 7中用imageWrite.exe 软件制作的.安装的 ...
- bat删除多少天前的文件包含子目录
通过 Forfiles 删除指定目录下过期的备份文件 /*-- 用法详解 D:/>forfiles /? FORFILES [/P pathname] [/M searchmask] [/S] ...
- Cannot find module '@babel/plugin-proposal-class-properties'
cnpm install --save-dev @babel/plugin-proposal-class-properties
- 北京服务业占GDP比重达81.7%
北京服务业占GDP比重达81.7% 2017-05-17 19:46:00 来源: 中国新闻网(北京)举报 0 易信 微信 QQ空间 微博 更多 (原标题:北京服务业占GDP比重达81.7%) ...
- Java-slf4j:sfl4j
ylbtech-Java-slf4j:sfl4j 1.返回顶部 1. SLF4J,即简单日志门面(Simple Logging Facade for Java),不是具体的日志解决方案,它只服务于各种 ...
- python3快速安装
linux环境快速安装python3 之前在linux上安装python3的时候,为了让不影响linux环境原有的python2的环境,选择的方法都是下载对应的linux环境的python包,不过 ...
- HDU 3923 Invoker | 暑训Day1 C题填坑
暑训第一天,专题为组合数学与概率期望. 最近一个月都没有学习新的知识,上午听聚聚讲课头脑都是一片空白.加上长期没刷题,下午做练习题毫无感觉.到晚上总算理清了蓝书上的一些概念,跟着榜单做题.最后唯独剩下 ...
- Python学习day01 - 计算机基础
第一天 什么是编程 语言就是用来交流的. 语言+火构成了人类的文明 Python语言用来和计算机交流 通过他和计算机交流,然后完成很多程序员想要完成的事情,就叫编程. 为什么要编程 节省劳动力,更高效 ...
- 04-6-queryselect
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 2019-3-1-VisualStudio-扩展开发-获得输出窗口内容
title author date CreateTime categories VisualStudio 扩展开发 获得输出窗口内容 lindexi 2019-03-01 09:21:41 +0800 ...