1 条题解

  • 0
    @ 2026-1-27 19:21:47
    #include<bits/stdc++.h>
    using namespace std;
    
    vector<int> family[110];  // [1] 邻接表,存储树的边(无向),family[a]表示与节点a相连的所有节点
    int l[110];               // [2] l数组-存储每个节点的深度(根节点1的深度为1)
    int c[110];               // [3] c数组-存储每个节点为根的子树的大小(包含自身)
    
    // 递归函数:计算子树大小和节点深度
    // a: 当前遍历的节点;b: 当前节点的父节点(避免回头遍历)
    void ex(int a,int b){
        l[a] = l[b] + 1;      // [4] 当前节点a的深度 = 父节点b的深度 + 1(根节点1的父节点是0,l[0]=0,所以l[1]=1,符合题目要求)
        c[a] = 1;             // [5] 初始化子树大小为1(子树至少包含当前节点a本身)
        // 遍历当前节点a的所有邻接节点
        for(int i=0;i<family[a].size();i++){
            int r = family[a][i];  // [6] 取出邻接节点r
            if(r != b){            // [7] 跳过父节点b,避免递归回到父节点
                ex(r, a);          // [8] 递归遍历子节点r,父节点为当前节点a
                c[a] += c[r];      // [9] 将子节点r的子树大小累加到当前节点a的子树大小中
            }
        }
    }
    
    int main(){
        int n;                   // [10] n-树的节点总数
        cin>>n;
        int a,b;
        // 读入n-1条无向边,构建邻接表
        for(int i=1;i<n;i++){
            cin>>a>>b;
            family[a].push_back(b);  // [11] 把b加入a的邻接列表
            family[b].push_back(a);  // [12] 把a加入b的邻接列表(因为树是无向的)
        }
        l[0] = 0;  // [13] 初始化父节点0的深度为0(根节点1的父节点设为0,确保l[1]=1)
        ex(1, 0);  // [14] 从根节点1开始递归遍历,父节点为0
        
        // 输出每个节点的子树大小和深度
        for(int i=1;i<=n;i++){
            cout<<c[i]<<" "<<l[i]<<endl;  // [15] 第i行输出节点i的子树大小c[i]和深度l[i]
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1067
    时间
    1000ms
    内存
    256MiB
    难度
    1
    标签
    递交数
    1
    已通过
    1
    上传者