首页 > 其他分享 >Tree Distances I

Tree Distances I

时间:2023-08-15 20:55:52浏览次数:26  
标签:Distances int sum Tree DFS fa MaxN 答案

Tree Distances I

思路

先考虑只算节点 \(1\) 的答案,我们发现如果要每个节点都这么算一次的话,绝对会image
我们发现,这种算法的瓶颈在于必须要每个节点都算一遍,而每算一遍都需要 \(O(n)\),所以才会超时,那么可以思考如何快速的求出答案(总共 \(O(1)\) 是不肯能的,别妄想了),对于相连的两个点,似乎是存在一些关系的,比如:
设 \(f_u\) 为 \(u\) 的答案,\(g_u\) 为子树根节点为 \(u\) 的子树深度。
节点 \(x\) 和他的父亲 \(y\),那么如果知道 \(y\) 的答案,那么 \(x\) 的可能的答案可以是 \(f_y + 1\)。
但是我们知道 \(x\) 的答案还可以往下找,所以 \(x\) 的答案还可以是 \(g_x\)。
不过推到这里还不算完,因为如果说 \(f_y\) 的路径中包含 \(x\) 那么答案就不能是 \(f_y\) 了,因为 \(x\) 的答案的路径不可能折上去又折下来,所以重新设计:
设 \(f_{u,0}\) 为 \(u\) 的答案最大值,\(f_{u,1}\) 为 \(u\) 的答案次大值,\(g\) 不变。
那么如果说在 \(f_{y,0}\) 的路径中有 \(x\),那么就可以用 \(f_{y,1}\) 来更新答案,否则用 \(f_{y,0}\),然后就结了。

code

点击查看代码
#include <iostream>
#include <vector>

using namespace std;

const int MaxN = 2e5 + 10;

int f[MaxN][2], n;
vector<int> g[MaxN];

void S(int x, int fa) {
  for (int i : g[x]) {
    if (fa == i) continue;
    S(i, x);
    int w = f[i][0] + 1;
    if (f[x][0] < w) {
      f[x][1] = f[x][0], f[x][0] = w;
    } else if (f[x][1] < w) {
      f[x][1] = w;
    }
  }
}

void DFS(int x, int fa) {
  for (int i : g[x]) {
    if (i == fa) continue;
    if (f[i][0] + 1 == f[x][0]) {
      int w = f[x][1] + 1;
      if (f[i][0] < w) {
        f[i][1] = f[i][0], f[i][0] = w;
      } else if (f[i][1] < w) {
        f[i][1] = w;
      }
    } else {
      int w = f[x][0] + 1;
      if (f[i][0] < w) {
        f[i][1] = f[i][0], f[i][0] = w;
      } else if (f[i][1] < w) {
        f[i][1] = w;
      }
    }
    DFS(i, x);
  }
}

int main() {
  cin >> n;
  for (int i = 1, u, v; i < n; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  S(1, -1);
  DFS(1, -1);
  for (int i = 1; i <= n; i++) {
    cout << f[i][0] << " ";
  }
  return 0;
}

习题 Tree Distances II(更水的题)

由于父亲的答案被占用了,也不会影响统计答案,然后如果用父亲 \(y\) 的答案转移到儿子 \(x\) 的话,那么除了 \(x\) 的子树的其它所有节点到 \(x\) 的答案都要 \(+1\),而 \(x\) 及以下的答案都要 $ - 1$,所以可以设 \(sum_i\) 为子树 \(i\) 的大小,然后可以推出:\(f_x=f_y+(sum_1-sum_x)-sum_x\)。

code

点击查看代码
#include <iostream>
#include <vector>

using namespace std;
using ll = long long;

const int MaxN = 2e5 + 10;

ll f[MaxN], sum[MaxN], n;
vector<int> g[MaxN];

ll S(int x, int fa) {
  ll res = 0;
  sum[x] = 1;
  for (int i : g[x]) {
    if (fa == i) continue;
    res += S(i, x) + sum[i];
    sum[x] += sum[i];
  }
  return res;
}

void DFS(int x, int fa) {
  for (int i : g[x]) {
    if (i == fa) continue;
    f[i] = f[x] + (sum[1] - sum[i]) - sum[i];
    DFS(i, x);
  }
}

int main() {
  cin >> n;
  for (int i = 1, u, v; i < n; i++) {
    cin >> u >> v;
    g[u].push_back(v);
    g[v].push_back(u);
  }
  f[1] = S(1, -1);
  DFS(1, -1);
  for (int i = 1; i <= n; i++) {
    cout << f[i] << " ";
  }
  return 0;
}

标签:Distances,int,sum,Tree,DFS,fa,MaxN,答案
From: https://www.cnblogs.com/ybtarr/p/17632352.html

相关文章

  • WPF 由TreeView想到的 DataTemplate,HierarchicalDataTemplate
    DataTemplate简而言之,解决的就是后台代码中的类以怎么样的形式展现在xaml前台代码中的问题。所以DataTemplate一般都要指定DataType,一般放在resource中,而HierarchicalDataTemplate是一种特殊的DataTemplate,它指定一个ItemsSource,当自身属性是列表时,有次序的在前台展示下去。以......
  • LeetCode 7022——熟悉TreeSet数据结构及常用方法的使用
    LeetCode7022.限制条件下元素之间的最小绝对差题目描述:给你一个下标从 0 开始的整数数组 nums 和一个整数 x 。请你找到数组中下标距离至少为 x 的两个元素的 差值绝对值 的 最小值 。换言之,请你找到两个下标 i 和 j ,满足 abs(i-j)>=x 且 abs(nums[i......
  • Binary Tree Preorder Traversal
    SourceGivenabinarytree,returnthepreordertraversalofitsnodes'values.NoteGivenbinarytree{1,#,2,3},1\2/3return[1,2,3].ExampleChallengeCanyoudoitwithoutrecursion?题解1-递归递归版很好理解,首先判断当前节点......
  • Subtree 题解
    Subtree题目大意给定一颗树,你可以选出一些节点,你需要对于每个点求出在强制选这个点的情况下所有选择的点联通的方案数,对给定模数取模。思路分析对于这种求树上每一个点方案数的题目,首先考虑换根DP。强制嵌定树根为\(1\),设\(f_i\)表示在\(i\)的子树中选点,\(i\)强制选,所......
  • SourceTree git报错 这是一个无效源路径/URL的
    首先根据网上查询的资料排查账号信息,账号信息正常,git客户端也安装了 解决问题:git支持未打开  未打开的样式类似下面 ......
  • dus on tree学习笔记
    前言dusontree就像其实就像是暴力,但是通过选择正确的顺序,使得暴力变得更加的快速。算法思路查看题目给出一颗n个节点的树,每个节点有一个颜色,询问你没个节点的子树中有多少中颜色。显然,我们知道暴力扫的话是枚举每个点,再暴力去找他的子树,显然在暴力的情况下是\(O(n......
  • Paper Reading: NBDT: Neural-Backed Decision Trees
    目录研究动机文章贡献本文方法推理建立层次结构用WordNet标记决策节点微调和树监督损失实验结果对比实验结果可解释性识别错误的模型预测引导图像分类人更倾向的解释识别有缺陷的数据标签优点和创新点PaperReading是从个人角度进行的一些总结分享,受到个人关注点的侧重和实力......
  • 全局引用ant-design-vue的TreeSelect没有样式
    在全局只按需引用了TreeSelect---vue.use(TreeSelect)没有样式.........需要在babel.config.js里的plugins配置plugins:[["import",{"libraryName":"ant-design-vue",//库名称"libraryDirectory"......
  • el-tree 全部禁用 超简单解决办法
    有这么个需求,要求el-tree有多选框,但是要全部禁用,只展示看 但是el-tree这个属性上没有看到全部禁用的属性,只看到了单个节点禁用,所以有一个麻烦的办法,就是递归禁用所有节点,但是这个方法麻烦耗时,所以看到官方文档有这么个东西 于是我们想办法,把这个Props用上,于是就这样了......
  • elementui el-tree的使用方法
    el-tree一般用于节点下有很多子节点接口返回的数据格式,可以无线子节点deptOptions:[{"id":"1686631142746230785","label":"小王测试部门","children":[{"id&......