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 ...
随机推荐
- [洛谷P2073] 送花
送花 题目背景 小明准备给小红送一束花,以表达他对小红的爱意.他在花店看中了一些花,准备用它们包成花束. 题目描述 这些花都很漂亮,每朵花有一个美丽值W,价格为C. 小明一开始有一个空的花束,他不断地 ...
- angular js 自定义添加依赖
代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 几种不同的json格式解析
转连接: http://blog.csdn.net/whx405831799/article/details/42171191 内容很好 给服务端发送请求后,服务端会返回一连串的数据,这些数据在大部分 ...
- Bzoj1692 洛谷P2870 [Usaco2007 Dec]队列变换
Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1570 Solved: 656 Description FJ打算带他的N(1 <= N <= ...
- bzoj2442&&codevs4654 单调队列优化dp
这道题也是一道单调队列 很明显满足各种性质 f[i]表示i不选前面k-1个都选的最小损失 维护的是个单增队列 q[head]是队列最小值 代码十分简介 注意longlong就okay #include ...
- Vijos 1232 核电站问题
核电站问题 描述 一个核电站有N个放核物质的坑,坑排列在一条直线上.如果连续M个坑中放入核物质,则会发生爆炸,于是,在某些坑中可能不放核物质. 现在,请你计算:对于给定的N和M,求不发生爆炸的放置核物 ...
- [bzoj4515][Sdoi2016]游戏-树链剖分+李超线段树
Brief Description Alice 和 Bob 在玩一个游戏. 游戏在一棵有 n 个点的树上进行.最初,每个点上都只有一个数字,那个数字是 123456789123456789. 有时,A ...
- vue 数组、对象 深度拷贝和赋值
由于此对象的引用类型指向的都是一个地址(除了基本类型跟null,对象之间的赋值,只是将地址指向同一个,而不是真正意义上的拷贝) 数组: let a = [11,22,33]; let b = a; / ...
- POJ2186 (强连通分量缩点后出度为0的分量内点个数)
Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 27820 Accepted: 11208 De ...
- STL各个数据结构特点
STL容器特征总结 2011-11-09 11:10:50| 分类: STL|举报|字号 订阅 STL中顺序容器类和关联式容器类的主要特征如下:(1)Vector 1.内部数据结构:连续存储 ...