东方博宜——找树根:D

东方博宜

树及树的应用

2188. 找树根(https://oj.czos.cn/lists/display?id=2188&lid=25&cid=82

问题描述

一棵树有 n 个结点,已知树上所有的父子结点关系,请问该树的根是几号结点,哪个结点的子结点最多,该结点有哪些子结点。

输入

第一行,有 1 个整数 n 代表结点数量(1<n≤100)

接下来若干行;每行两个结点 x 和 y,表示 y 是 x 的孩子(1≤x,y≤1000)

请注意:树上结点的编号不一定是连续的。

输出

第一行输出树根的编号。

第二行输出孩子最多的结点编号(如果有多个结点的子结点都是最多的,则输出编号最大的那个)。

第三行输出第二行求出的孩子最多的结点,有哪些孩子,按照编号从小到大,输出这些孩子的编号,用空格隔开。

样例

输入
5
4 1
4 2
1 3
1 5
输出
4
4
1 2

解析:树,向量

难点:编号不连续

代码如下:

#include<bits/stdc++.h>
using namespace std;
vector<int> c[10001];//儿子有哪些
int fa[10001];//父亲是谁
int main()
{
	int i,n,x,y,ans1,ans2,maxn=0;
	cin>>n;
	for(i=1;i<=n-1;i++)
	{
		cin>>x>>y;
		c[x].push_back(y);
		fa[y]=x;
        //构建树
	}
	for(i=1;i<=1000;i++)//!!是1000(编号不连续)
	{
		if(fa[i]==0&&c[i].size()!=0)//如果该节点没有父亲,且有儿子,那么它就是根节点
		{
			ans1=i;
		}
		if(c[i].size()>=maxn)//如果有多个结点的子结点都是最多的,则标记编号最大的那个
		{
			maxn=c[i].size();
			ans2=i;
		}
	}
	cout<<ans1<<endl<<ans2<<endl;
	sort(c[ans2].begin(),c[ans2].end());//把最优解的儿子排序
	for(i=0;i<c[ans2].size();i++)
	{
		cout<<c[ans2][i]<<" ";//输出
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值