【题目链接】 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)的更多相关文章

  1. ZOJ 3949 Edge to the Root( 树形dp)

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3949 题解:树dp真的很直觉,或者说dp真的很直觉.就上周末比赛时其实前一 ...

  2. 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 ...

  3. ZOJ 3949 Edge to the Root

    题意: 在一棵树中,可以从根节点往其他节点加一条边,使得根节点到其他所有节点的距离和最小,输出最小的距离和. 思路: 我们考虑在加的一条边为$1 \to v$,那么在树上从$1 \to v$的路径上, ...

  4. ZOJ 3626 Treasure Hunt I(树形dp)

    Treasure Hunt I Time Limit: 2 Seconds      Memory Limit: 65536 KB Akiba is a dangerous country since ...

  5. ZOJ 3626 Treasure Hunt I (树形DP,常规)

    题意:给一棵树,一个人站在节点s,他有m天时间去获取各个节点上的权值,并且最后需要回到起点s,经过每条边需要消耗v天,问最少能收获多少权值? 思路: 常规的,注意还得跑回原地s. //#include ...

  6. ZOJ 3805 (树形DP)

    题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5337 题目大意:方块连接,呈树形.每个方块有两种接法,一种接在父块 ...

  7. ZOJ 3201 树形dp+背包(简单题)

    #include<cstdio> #include<vector> #include<cstring> #include<iostream> using ...

  8. ZOJ 3188 ZOJ 3188 Treeland Exhibition(树形DP)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=3278 题意:给出一棵树,找出一个不大于长度为m的链,使得其他点到该链 ...

  9. 树dp...吧 ZOJ 3949

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5568 Edge to the Root Time Limit: 1 Secon ...

随机推荐

  1. JQuery用鼠标选文字来发新浪微博

    最近注意到新浪博客有个小功能,就是当鼠标选中一段文字时会浮现一个小图片,点击这个图片可以把选中内容发送到新浪微博,一时兴起昨晚就写了一个Demo玩了一下,代码超简单,没优化,有兴趣的朋友可以自己改进. ...

  2. ios10 safari浏览器 在touchmove 里面写e.preventDefault(); 不起作用 的解决方法

    最近做手机端项目遇到一个问题,就是在ios10系统里面  safari浏览器 在touchmove 里面写e.preventDefault();不起作用 更种google 还是没有找到解决方法 最后找 ...

  3. echarts中图表过于靠左或靠右的情况解决办法。

    经过好多次尝试,终于在http://blog.csdn.net/ainuser/article/details/76641963中得到解决. grid: { x: '30%', //相当于距离左边效果 ...

  4. HDU 5655 四边形判断

    CA Loves Stick Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  5. x:Class, x:Key

    x:Class: 用来创建一个partial的class, 比如默认生成的x:Class="MyTest.MainWindow", 会自动生成一个MainWindow的partia ...

  6. Java面向对象编程三大特性 --- 多态

    多态特性: 子类Child继承父类Father,我们可以编写一个指向子类的父类类型引用,该引用既可以处理父类Father对象,也可以处理子类Child对象,当相同的消息发送给子类或者父类对象时,该对象 ...

  7. bzoj 2190 线性生成欧拉函数表

    首先我们知道,正方形内个是对称的,关于y=x对称,所以只需要算出来一半的人数 然后乘2+1就行了,+1是(1,1)这个点 开始我先想的递推 那么我们对于一半的三角形,一列一列的看,假设已经求好了第I- ...

  8. EL表达式中获取list长度(JSTL函数用法)

    在jsp页面中不能通过${list.size}取列表长度,而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref ...

  9. LeetCode Regular Expression Matching 网上一个不错的实现(非递归)

    '.' Matches any single character.'*' Matches zero or more of the preceding element. The matching sho ...

  10. Swift教程之运算符重载

    http://blog.csdn.net/mengxiangyue/article/details/43437797 原文地址:http://www.raywenderlich.com/80818/o ...