ZOJ 3949 Edge to the Root(树形DP)
【题目链接】 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3949
【题目大意】
给出一棵根为1的树,每条边边长为1,请你从根连一条边到某个点,
使得各点到根距离的总和最小,求这个最小距离和
【题解】
假设从1连到x,那么受影响的只有1和x中点往下的部分,
我们发现中点往下的部分根据每个点答案改变的大小可以分为多个部分,
每个部分大小为其1-x链上的父节点子树大小减去其链上第一子节点子树大小,
设其链上父节点为y,那么这一块里每个点的距离变化为2*dy-1-dx
那么答案变化为∑(2*dy-1-dx)=-sizeall*dx+∑(2*dy-1)
所以我们按链维护(1-2*dy)*sizey的前缀和,这里sizey指的是固定块的大小而不是子树大小
固定块的大小我们可以通过子树大小加减得到,当计算另一条链的时候,我们回溯消除影响,
对于节点x的答案,我们可以取其链上前缀和与其中点的链上前缀和的差值,
就得到了受影响部分的(1-2*dy)*sizey的和,在加上sizeall*dx,得到答案变化
我们求出每个节点答案可能变化的最小值,和原本的固定答案相加,就是这题的答案。
【代码】
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
typedef long long LL;
const int N=200010;
vector<int> G[N];
int cnt,st[N],size[N],d[N];
LL C[N],S[N],ans,all;
void dfs(int x,int fx){
d[x]=d[fx]+1;
all+=d[x];
size[x]=1;
for(int i=0;i<G[x].size();i++){
int v=G[x][i];
if(v!=fx){
dfs(v,x);
size[x]+=size[v];
}
}
}
void dfs2(int x,int fx){
if(cnt)S[cnt]-=C[cnt]*size[x];
st[++cnt]=x;
C[cnt]=1-2*d[x];
S[cnt]=S[cnt-1]+C[cnt]*size[x];
if(fx){
int mid=(cnt+1)/2;
ans=min(ans,S[cnt]-S[mid]+1LL*size[st[mid+1]]*d[x]);
}
for(int i=0;i<G[x].size();i++){
int v=G[x][i];
if(v!=fx)dfs2(v,x);
}if(--cnt)S[cnt]+=C[cnt]*size[x];
}
int T,n;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)G[i].clear();
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}d[all=ans=0]=-1;
dfs(1,0);
dfs2(1,0);
printf("%lld\n",all+ans);
}return 0;
}
ZOJ 3949 Edge to the Root(树形DP)的更多相关文章
- ZOJ 3949 Edge to the Root( 树形dp)
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3949 题解:树dp真的很直觉,或者说dp真的很直觉.就上周末比赛时其实前一 ...
- ZOJ 3949 Edge to the Root(想法)(倍增)
Edge to the Root Time Limit: 1 Second Memory Limit: 131072 KB Given a tree with n vertices, we ...
- ZOJ 3949 Edge to the Root
题意: 在一棵树中,可以从根节点往其他节点加一条边,使得根节点到其他所有节点的距离和最小,输出最小的距离和. 思路: 我们考虑在加的一条边为$1 \to v$,那么在树上从$1 \to v$的路径上, ...
- ZOJ 3626 Treasure Hunt I(树形dp)
Treasure Hunt I Time Limit: 2 Seconds Memory Limit: 65536 KB Akiba is a dangerous country since ...
- ZOJ 3626 Treasure Hunt I (树形DP,常规)
题意:给一棵树,一个人站在节点s,他有m天时间去获取各个节点上的权值,并且最后需要回到起点s,经过每条边需要消耗v天,问最少能收获多少权值? 思路: 常规的,注意还得跑回原地s. //#include ...
- ZOJ 3805 (树形DP)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5337 题目大意:方块连接,呈树形.每个方块有两种接法,一种接在父块 ...
- ZOJ 3201 树形dp+背包(简单题)
#include<cstdio> #include<vector> #include<cstring> #include<iostream> using ...
- ZOJ 3188 ZOJ 3188 Treeland Exhibition(树形DP)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3278 题意:给出一棵树,找出一个不大于长度为m的链,使得其他点到该链 ...
- 树dp...吧 ZOJ 3949
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5568 Edge to the Root Time Limit: 1 Secon ...
随机推荐
- 安卓titlebar的组合控件使用
http://blog.csdn.net/itachi85/article/details/51435187
- 存储过程-----DECLARE---实用注意事项
定义与使用变量时需要注意以下几点: ◆ DECLARE语句必须用在DEGIN…END语句块中,并且必须出现在DEGIN…END语句块的最前面,即出现在其他语句之前. ◆ DECLARE定义的变量的作用 ...
- javascript中arguments的应用——不定项传参求和
<script type="text/javascript"> window.onload=function(){ function sum(){ var result ...
- 使用e.target.dataset的问题
在微信开发中我们经常会用到标签中属性的属性值,有时候我们通过 data-* 和 e.target.dateset 来获取属性值会出现一点小bug,即是调用出来的数据是undefined. 1)方案1– ...
- BigDecimal精度问题
介绍 1.商业计算使用BigDecimal. 2.使用参数为String的构造函数. 3.BigDecimal都是不可变的,每一步的运算时,都会产生一个新的对象.所以在做加减乘除后千万要保存操作后的值 ...
- 在DirectX11下用Stencil Buffer绘制可视化Depth Complexity
这是一道在<Introduction to 3D Game Programming with DirectX 11>上的练习题. 要求把某个像素点上的Depth Complexity(深度 ...
- html 表格获取单行
参考:http://www.jb51.net/article/63161.htm function cell(btn_id) { {#var x=document.getElementById('#' ...
- [Leetcode Week10]Minimum Time Difference
Minimum Time Difference 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/minimum-time-difference/desc ...
- 视频图像处理基础知识5(RGB与Ycbcr相互转换公式 )【转】
转自:http://blog.csdn.net/Times_poem/article/details/51471438 版权声明:本文为博主原创文章,未经博主允许不得转载. 需求说明:视频处理算法基本 ...
- Codeforces 270E Flawed Flow 网络流问题
题意:给出一些边,给出边的容量.让你为所有边确定一个方向使得流量最大. 题目不用求最大流, 而是求每条边的流向,这题是考察网络流的基本规律. 若某图有最大,则有与源点相连的边必然都是流出的,与汇点相连 ...