题目大意:给定一棵 N 个点的边权均为 1 的树,依次输出每个点到其他各个点的距离和。

题解:首先任意选定一个节点为根节点,比如 1,第一遍 dfs 遍历树求出子树大小、树上前缀和。第二遍 dfs 遍历这棵树,求出各个点的距离和。

对于遍历到的任意一个节点 i,对于与之相邻的节点 j 来说,答案贡献由 i 到 j 转移首先减小了 \(size[j]*1\),同时增加了 \((n-size[j])*1\),因此可以直接得到\(dp[j]=dp[i]+n-size[j]*2\)。

代码如下

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int maxn=1e5+10;
  4. inline int read(){
  5. int x=0,f=1;char ch;
  6. do{ch=getchar();if(ch=='-')f=-1;}while(!isdigit(ch));
  7. do{x=x*10+ch-'0';ch=getchar();}while(isdigit(ch));
  8. return f*x;
  9. }
  10. struct node{
  11. int nxt,to;
  12. }e[maxn<<1];
  13. int tot=1,head[maxn];
  14. int n,size[maxn],sum[maxn],dp[maxn];
  15. inline void add_edge(int from,int to){
  16. e[++tot]=node{head[from],to},head[from]=tot;
  17. }
  18. void read_and_parse(){
  19. n=read();
  20. for(int i=1;i<n;i++){
  21. int from=read(),to=read();
  22. add_edge(from,to),add_edge(to,from);
  23. }
  24. }
  25. void dfs1(int u,int fa){
  26. size[u]=1;
  27. for(int i=head[u];i;i=e[i].nxt){
  28. int v=e[i].to;if(v==fa)continue;
  29. sum[v]=sum[u]+1;
  30. dfs1(v,u);
  31. size[u]+=size[v];
  32. }
  33. dp[1]+=sum[u];
  34. }
  35. void dfs2(int u,int fa){
  36. for(int i=head[u];i;i=e[i].nxt){
  37. int v=e[i].to;if(v==fa)continue;
  38. dp[v]=dp[u]+n-(size[v]<<1);
  39. dfs2(v,u);
  40. }
  41. }
  42. void solve(){
  43. dfs1(1,0),dfs2(1,0);
  44. for(int i=1;i<=n;i++)printf("%d\n",dp[i]);
  45. }
  46. int main(){
  47. read_and_parse();
  48. solve();
  49. return 0;
  50. }

【51Nod1405】树上距离和 二次扫描与换根法的更多相关文章

  1. 题解 poj3585 Accumulation Degree (树形dp)(二次扫描和换根法)

    写一篇题解,以纪念调了一个小时的经历(就是因为边的数组没有乘2 phhhh QAQ) 题目 题目大意:找一个点使得从这个点出发作为源点,流出的流量最大,输出这个最大的流量. 以这道题来介绍二次扫描和换 ...

  2. poj 3585 Accumulation Degree(二次扫描和换根法)

    Accumulation Degree 大致题意:有一棵流量树,它的每一条边都有一个正流量,树上所有度数为一的节点都是出口,相应的树上每一个节点都有一个权值,它表示从这个节点向其他出口可以输送的最大总 ...

  3. 【POJ3585】Accumulation Degree 二次扫描与换根法

    简单来说,这是一道树形结构上的最大流问题. 朴素的解法是可以以每个节点为源点,单独进行一次dp,时间复杂度是\(O(n^2)\) 但是在朴素求解的过程中,相当于每次都求解了一次整棵树的信息,会做了不少 ...

  4. poj3585 树形dp 二次扫描,换根法模板题

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

  5. POJ3585 Accumulation Degree(二次扫描与换根法)

    题目:http://poj.org/problem?id=3585 很容易想出暴力.那么就先扫一遍. 然后得到了指定一个根后每个点的子树值. 怎么转化利用一下呢?要是能找出当前点的父亲的 “ 不含当前 ...

  6. poj - 3585(二次扫描与换根法)

    周末牛客挂了个更难的,这个简单一些 #include<iostream> #include<cstring> #include<cstdio> #include&l ...

  7. $Poj3585\ Accumulation Degree$ 树形$DP/$二次扫描与换根法

    Poj Description 有一个树形的水系,由n-1条河道与n个交叉点组成.每条河道有一个容量,联结x与y的河道容量记为c(x,y),河道的单位时间水量不能超过它的容量.有一个结点是整个水系的发 ...

  8. [LuoguP1829]Crash的文明表格(二次扫描与换根+第二类斯特林数)

    Solution: ​ 由于 \[ x^m = \sum_{i=0}^m{~m~\choose i}{~x~\brace i}i! \] ​ 将所求的式子化成这样,挖掘其性质,考虑是否能从儿子转移(或 ...

  9. POJ - 3585 树上最大流 换根法

    题意:给出一棵树,边上有容量限制,求以任一点作为根和源点,叶子作为汇点的最大流的最大值 首先上网络流等于找死 树形DP可以\(O(n)\)求出以某点\(u\)为根的最大流,只需设\(f[u]=\sum ...

随机推荐

  1. Jmeter(二十九)_dotnet搭建本地接口服务

    这里使用的服务名为Bookshelf,在github上,自行下载.要运行此服务,需要.Net Core SDK 2.1或更高版本.如果尚未安装,从.Net Core官方网站下载并安装. 在本地克隆项目 ...

  2. Runaway argument错误 [Overleaf: 在线Latex] [Type 3问题后续]

    [背景与问题描述] 在Latex中,经常出现各种问题: Runaway argument? {\contentsline {subsection}{\numberline {6.3}General c ...

  3. [转载]sql 盲注之正则表达式攻击

    [转载]sql 盲注之正则表达式攻击 -----------------------------------------MYSQL 5+-------------------------------- ...

  4. centos下升级git版本的操作记录

    在使用git pull.git push.git clone的时候,或者在使用jenkins发版的时候,可能会报类似如下的错误: error: The requested URL returned e ...

  5. centos6.8下LNMP (nginx1.8.0+php5.6.10+mysql5.6.12) - 部署手册

    在平时运维工作中,经常需要用到LNMP应用框架.以下对LNMP环境部署记录下: 1)前期准备:为了安装顺利,建议先使用yum安装依赖库[root@opd ~]#yum install -y make ...

  6. cometd简单用例

    准备工作 整个例子的源码下载:http://pan.baidu.com/s/1gfFYSbp 下载服务端jar文件 Comet4J目前仅支持Tomcat6.7版本,根据您所使用的Tomcat版本下载[ ...

  7. VS2013软件的安装和单元测试

    VS2013是什么? 微软在Builder 2013开发者大会上发布了Visual Studio 2013预览版,并且发布其程序组件库.NET 4.5.1的预览版.该软件已于北京时间2013年11月1 ...

  8. Scrum Meeting NO.10

    Scrum Meeting No.10 1.会议内容 2.任务清单 徐越 序号 近期的任务 进行中 已完成 1 "我"回答过的问题 -- 界面 √ 2 "问题" ...

  9. C++中struct 和 class的区别

    首先,C++中类的定义,从狭义上理解,就是我们使用的class类型.从广义上,类就是定义了一个新的类型和新的作用域,它具有成员函数和成员数据. 而对广义类定义的实现分为两种,一种是使用struct实现 ...

  10. [Wiki].NET框架

    .NET框架 建议将.NET Framework 3.0并入本条目或章节.(讨论)  .NET框架 .NET框架的组件堆栈 开发者 Microsoft 初始版本 2002年2月13日,​16年前 稳定 ...