华东师范大学上机题——计算结点个数
题目描述:
有一个研究团队,团队分成许多研究小组,每个小组的一部分成员可能再分成小组。小组的成员只知道自己的组长是谁,而在同一组长的领导下的成员之间却相互不认识。现在这个团队希望有一个程序统计一下各组长带领小组的规模,即对每一个成员想知道自己及自己带领下的小组有多少人。
输入:2行,第1行有1个数字N(0<N<2*105),代表小组的人数
第2行有N个数a1,a2,…aN,表示第i个人的领导是ai。团队的领导用0表示,说明没有人做他的组长。数据保证没有环路。单独的一个成员视为1个人的小组。
输出:1行,N个数字,表示第i名成员的团队的规模
Sample Input:
0 1 2 1 2 2
Sample Output:
6 4 1 1 1 1
算法思想:
先画出双亲表示法画出的树:
根据双亲表示法画出的树,如果求以1为根节点的所包含的结点的个数时,3->2->1,5->2->1,6->2->1,2->1,4->1共有5+1=6个,同理可得2是3+1=4个。定义一个数组用来遍历这个树,看每个结点被扫描的次数即是以其为根节点所包含的结点个数。
#include<iostream>
using namespace std;
void function(int arr[], int n) {
int* num = new int[n + 1];
for (int i = 1;i < n + 1;i++)
num[i] = 1;
for (int i = 1;i < n + 1;i++) {
if (arr[i] == 0) {
continue;
}
else {
int k = i;
while (arr[k] != 0) {
int j = arr[k];
num[j]++;
k = j;
}
}
}
for (int i = 1;i < n + 1;i++)
cout << num[i] << " ";
}
int main() {
int n = 0;
cout << "输入团队总人数:";
cin >> n;
int* arr = new int[n + 1];
for (int i = 1;i < n + 1;i++)
cin >> arr[i];
function(arr, n);
return 0;
}
运行测试结果: