3608 - 找树根和孩子

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

题目输入

第一行:n(结点个数),m(边数)。
以下m行;每行两个结点xy,表示yx的孩子。

题目输出

第一行:树根:root
第二行:孩子最多的结点max
第三行:max的孩子。

输入/输出样例

题目输入

8 7
4 1
4 2
1 3
1 5
2 6
2 7
2 8

题目输出

4
2
6 7 8

提示

注意:孩子最多的不一定是一个结点。如果是多个结点都应该输出。

例如:

输入

7 6

1 2
1 3
3 4
3 5
5 6
5 7

输出<br />

1
1
2 3
3
4 5
5
6 7

C++解答

#include<iostream>
#include<set>
using namespace std;
int main(){
    int n,m;    cin>>n>>m;
    int father[n+1];  //存父亲下标的数组   双亲表示法
    set<int> CH[n+1]; //为每个节点开一个set   存储它的孩子
	for(int i=1;i<=n;i++) father[i]=-1;
	int x,y;
	for(int i=0;i<m;i++)
	{
		cin>>x>>y;
		father[y]=x;
		CH[x].insert(y);
	}
	for(int i=1;i<=n;i++)
		if(father[i]==-1) cout<<i<<endl;
    int max=0;
	for(int i=1;i<=n;i++)   //扫描一次,统计最大值
        if(CH[i].size()>max) max=CH[i].size();

    for(int i=1;i<=n;i++)
    if(CH[i].size()==max){
        cout<<i<<endl;
        set<int>::iterator it;
        for(it=CH[i].begin();it!=CH[i].end();it++)
            cout<<*it<<' ';
        cout<<endl;
    }
	    //cout<<i<<':'<<CH[i].size()<<endl;
    return 0;
}

提示

注意:孩子最多的不一定是一个结点。如果是多个结点都应该输出。

例如:

输入

7 6

1 2
1 3
3 4
3 5
5 6
5 7

输出<br />

1
1
2 3
3
4 5
5
6 7

时间限制 1 秒
内存限制 128 MB
讨论 统计
上一题 下一题