首页 > 其他分享 >东方博宜 2166 - 子树的大小及深度

东方博宜 2166 - 子树的大小及深度

时间:2023-07-25 18:55:31浏览次数:38  
标签:结点 子树 int 博宜 深度 大小 2166 节点

题目描述

现在有一棵 n 个结点的树,结点 1为这棵树的根,结点 1 的深度为 1,求出每棵子树的大小及每个结点的深度。

比如,有如下图所示的树:

该树中:

结点 1 对应的子树大小为 6,深度为 1。

结点 2 对应的子树大小为 5,深度为 2。

结点 3 对应的子树大小为 1,深度为 3。

结点 4 对应的子树大小为 1,深度为 3。

结点 5 对应的子树大小为 2,深度为 3。

结点 6 对应的子树大小为 1,深度为44。

输入

输入有 n 行。

第 1 行有一个整数 n,代表结点的数量,结点的编号为1∼n。(1≤n≤100)

接下来有 n−1行,每行有 2 个整数 x,y,表示结点 x 和 y 之间有一条边。(不保证 x 是 y 的父)

输出

输出有 n行。

第 i 行输出 2 个整数,分别是以编号 i为根的子树的大小,以及编号 i 对应的结点的深度。

样例

输入

6
1 2
5 2
2 3
4 2
5 6

输出

6 1
5 2
1 3
1 3
2 3
为什么东方博宜OJ不给看错误数据啊?我一题改1小时不知道错在哪,跟坐牢一样。
思路:
  • 首先输入的x,y不保证x是y的父,那意思就是无向边了。
  • 求深度不难想到是dfs,该点的深度就是自己的父节点的深度+1
  • 求子树就得要递归了,遍历每一个自己可以到的点(除了父节点,这就相当于走回去了),然后把他们的子树大小加起来就行

由于遍历每一个自己可以到的点,在求深度的时候也需要进行此操作,两个步骤可以合并在同一个函数里

代码:

#include<iostream>
#include<vector>
using namespace std;
//存储深度和子树大小
int deep[105],treesize[105];
int n,x,y;
//不确定每个节点有几个子节点,用vector节省空间
vector <int> a[110];
//x:当前节点,f:父节点
int dfs(int x,int f){
    //当前节点子树大小初始化为1
    treesize[x]=1;
    //x的深度为父节点+1
    deep[x]=deep[f]+1;
    //遍历每一个x可以去的点
    for(int i=0;i<a[x].size();i++){
        //除了自己的爹
        if(a[x][i]!=f){
            //递归
            treesize[x] += dfs(a[x][i],x);
        }
    }
    //返回x的子树大小
    return treesize[x];
}
int main(){
    scanf("%d",&n);
    //读入数据
    for(int i=1;i<n;i++){
        scanf("%d%d",&x,&y);
        a[x].push_back(y);
        a[y].push_back(x);
    }
    dfs(1,0);
    //输出
    for(int i=1;i<=n;i++){
        printf("%d %d\n",treesize[i],deep[i]);
    }
    return 0;
}

 

标签:结点,子树,int,博宜,深度,大小,2166,节点
From: https://www.cnblogs.com/Ghost1GM/p/17580688.html

相关文章

  • 洛谷 P1122 最大子树和 题解
    一道入门的树形DP。首先我们对于数据进行有序化处理,这便于我们利用数据结构特点(可排序性)来发觉数据性质(有序、单调、子问题等等性质),以便于后续的转化、推理和处理。有序化可以“转化和创造”性质首先将视角从无根树切换为有根树,这样我们就可以得到一个带有最优子结构、无后效性......
  • 题解 P2137 Gty的妹子树
    神奇的分块。假如没有\(2\)操作,我们可以直接用主席树解决。我们考虑将询问分块,每遍历完一块就将这一块内出现的所有修改更新。如果在块内,就把当前块之前的所有修改暴力算,当然只有修改的节点在询问的节点的子树内才会发生。具体的来说,我们可以用分块维护dfs序,并将块内的元素......
  • 算法- 求解最大平均值的子树-经典dfs题目
    给一棵二叉树,找到有最大平均值的子树。返回子树的根结点。Example样例1输入:{1,-5,11,1,2,4,-2}输出:11说明:这棵树如下所示:1/\-511/\/\124-211子树的平均值是4.333,为最大的。样例2输入:{1,-5,11}输出:11说明:1/\-5......
  • LeetCode 652. 寻找重复的子树
    classSolution{public:vector<TreeNode*>res;unordered_map<string,int>hashmap;//记录每一个子树出现的次数stringdfs(TreeNode*root){if(!root)return"";stringstr="";str+=to_string(root......
  • 1617. 统计子树中城市之间最大距离
    题目链接:1617.统计子树中城市之间最大距离方法:子集型回溯+判断连通+树的直径解题思路枚举所有可能的子树参考:子集型回溯判断当前的子树是否合法,即当前树是否连通,通过\(dfs\)从某一个节点开始遍历子树,若遍历节点数量不等于子树节点数量,则不连通;计算以每一个子树节点为......
  • 1519. 子树中标签相同的节点数
    题目描述给了一些点的连通关系,每个点的值都不同,每个点上都哟一个附加的标签(小写字母)问:每个节点i的子树中标签和i相同的节点数f1-无向图后序遍历基本分析怎么根据连接关系进行遍历?先建图遍历的时候没有方向,怎么保证不会回去?加一个父节点的参数,保证不会往前走?怎么维护当前节......
  • P1122 最大子树和
    P1122最大子树和-洛谷|计算机科学教育新生态(luogu.com.cn)题目就是要求:树上点权之和最大的一个连通分量令dp[i]为必须选i节点的情况下,最大的子树点权和则有转移......
  • 另一棵树的子树
    另一棵树的子树给你两棵二叉树root和subRoot。检验root中是否包含和subRoot具有相同结构和节点值的子树。如果存在,返回true;否则,返回false。二叉树tree的一......
  • P1352 没有上司的舞会+P1122 最大子树和(树形DP入门)
    前言今日偶然打开\(oi-wiki\),发现树形\(DP\)例题正好是之前在洛谷上鸽着的一道题。所以......\(\color{red}{很高兴以这样的方式认识你,树形DP!}\)这例题造的太好了......
  • Educational Codeforces Round 110 C(最长连续字串,dp),D(左右子树继承贡献dp)
    C.UnstableString题目大意:给定一个长度为n的字符串且只包括'0','1','?',其中如果一个字串是由01交替组成的则称谓不稳定的,如果碰到'?'则可以将其转化为0/1,求不稳定的......