华东师范大学上机题——计算结点个数

华东师范大学上机题——计算结点个数

题目描述:
有一个研究团队,团队分成许多研究小组,每个小组的一部分成员可能再分成小组。小组的成员只知道自己的组长是谁,而在同一组长的领导下的成员之间却相互不认识。现在这个团队希望有一个程序统计一下各组长带领小组的规模,即对每一个成员想知道自己及自己带领下的小组有多少人。
输入: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;
}

运行测试结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值