题目详情
介绍:
给定一棵树,输出树的根root,孩子最多的结点max以及他的孩子
输入:
第一行:n(0<结点数<=100),m(0<边数<=200)。
以下m行;每行两个结点x和y,表示y是x的孩子(x,y<=1000)。
其中所有结点的编号不一定是连续的
输出:
第一行:树根:root。
第二行:孩子最多的结点max(如果所求的结点有多个,则输出编号最大的那个)。
第三行:max的孩子。
算法简析
这道题很简单,给了 x 和y ,并且说明了 y 是 x 的孩子,就可以用父亲孩子表示法完成,而且很容易得到孩子最多的节点的孩子了
#include<bits/stdc++.h>
using namespace std;
long long n,m,tree[101],x,y,maxroot,num,maxn;
int main(){
cin>>n>>m;//输入结点数和边数
for(int i=1;i<=m;i++){
cin>>x>>y;//m次,每次输入x和y
tree[y]=x;
}
for(int i=n;i>=1;i--){
if(tree[i]==0){//表示没有父节点
cout<<i<<endl;//说明这个点就是根节点,直接输出
break;
}
}
for(int i=n;i>=1;i--){
num=0;
for(int j=1;j<=n;j++){
if(tree[j]==i) num++;//num表示这个根的度
}
if(num>maxn){
maxn=num;//记录最大的度
maxroot=i;//记录最大的度的节点的编号
}
}
cout<<maxroot<<endl;
for(int i=1;i<=n;i++){
if(tree[i]==maxroot) cout<<i<<" ";
}
return 0;
}