问题 A: 数据结构基础24-找树根和孩子

p.s.自用

题目描述

给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子

输入

第一行:n(结点数<=100),m(边数<=200)。   
以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。

输出

第一行:树根:root。   

第二行:孩子最多的结点max。   

第三行:max的孩子。

样例输入 Copy
8 7
4 1
4 2
1 3
1 5
2 6
2 7
2 8
样例输出 Copy
4
2 
6 7 8
易错

因采用数组存树,要注意在之后的求孩子代码中排除root的存在

答案
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int tree[1005] = { 0 };
int max[1005] = { 0 };//计数:孩子数

int main()
{
	int n, m, xi, yi;
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++)//初始化树
		tree[i] = i;
	for (int i = 0; i < m; i++)//存边
	{
		scanf("%d%d", &xi, &yi);
		tree[yi] = xi;//存父
		max[xi]++;//xi是父亲
	}
	int root = 1;
	while (tree[root] != root)
		root = tree[root];
	int MAX = -1;
	int numMax = -1;
	for (int i = 1; i <= n; i++)
	{
		if (max[i] > MAX)
		{
			MAX = max[i];
			numMax = i;
		}
	}
	printf("%d\n%d\n", root, numMax);
	for (int i = 1; i <= n; i++)
		if (tree[i] == numMax && tree[i] != i)
			printf("%d ", i);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值