1 条题解
-
0
#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
- 上传者