信息学奥赛一本通 1336:【例3-1】找树根和孩子

题目

1336:【例3-1】找树根和孩子

考点

  1. 树的存储和相关概念

代码

#include<iostream>
#include<queue>
using namespace std;
const int N = 108;
int parent[N], degrees[N];
// parent[i]表示节点i的父节点
// degrees[i]表示节点i的度

// 插入一条边,从x到y
void insert(int x, int y) {
	parent[y] = x;
}

// 找树根,统计度
int getRoot(int n) {
	int k = 0;
	for (int i = 1; i <= n; i++) {
		if (parent[i] == 0) k = i;  // 根节点的父亲是0
		degrees[parent[i]]++;
	}
	return k;
}

// 找度最大的节点
int getMax(int n) {
	int maxi = 0, deg = 0;
	for (int i = 1; i <= n; i++)
		if (degrees[i] > deg) {
			deg = degrees[i];
			maxi = i;
		}
	return maxi;
}
// 输出节点p的所有孩子
void printSons(int n, int p) {
	for (int i = 1; i <= n; i++) 
		if (parent[i] == p) cout << i << " ";
}
int main() {
	int n, m;
	cin >> n >> m;
	// 插入边
	for (int i = 1; i <= m; i++) {
		int x, y;
		cin >> x >> y;
		insert(x, y);
	}
	cout << getRoot(n) << endl;
	int p = getMax(n);
	cout << p << endl;
	printSons(n, p);

	return 0;
}

评测结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值