Background
Special for beginners, ^_^
Description
给定一棵树,输出树的根 root,孩子最多的结点 max 以及他的孩子。
Format
Input
第一行:n(结点数≤100),m(边数≤200)。
以下 m 行;每行两个结点 x 和 y,表示 y 是 x 的孩子(x,y≤100)。
Output
第一行:树根:root。
第二行:孩子最多的结点 max。
第三行:max 的孩子。
Samples
输入数据 1
8 7
4 1
4 2
1 3
1 5
2 6
2 7
2 8
Copy
输出数据 1
4
2
6 7 8
Copy
Limitation
1s, 1024KiB for each test case.
--------------------------------------------------------------------------------------------------------------------------------
先分析,三个要求我们一个个看。
1.输出他的根。
输出根我们可以建一个数组,对所有数据记录他的父亲节点,就拿样例来说吧:
这时候可以发现4的father是0,那么4就是根。
那么我们就可以建一个数组fa[](father)。
2.输出孩子最多的节点
那我们就可以再建一个数组,对所有数据记录他的孩子个数,每找到一个孩子对应的父亲就加一。
再建一个数组ch[](child)。
3.输出孩子最多的节点孩子
是不是有点绕?其实很简单。
我们可以用上之前的fa[]数组,在数组里找父亲是孩子最多的节点,然后输出就好啦。
---------------------------------------------------------------------------------------------------------------------------------
看代码前先来段美味的广告:
此题来自沐枫oj,强烈建议大家去康康。
最后附上满分代码~
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int N=107;
int tree[N]={0};
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
tree[y]=x;
}
int root;
for(int i=1;i<=n;i++){
if(tree[i]==0){
root=i;
break;
}
}
int Max=0;
int maxroot=0;
for(int i=1;i<=n;i++){
int sum=0;
for(int j=1;j<=n;j++){
if(tree[j]==i)sum++;
}
if(sum>Max){
Max=sum;
maxroot=i;
}
}
cout<<root<<endl<<maxroot<<endl;
for(int i=1;i<=n;i++){
if(tree[i]==maxroot)cout<<i<<" ";
}
return 0;
}
简单(才怪)
求求了,赏点钱吧,作者写文章不易啊~
不行给个三连也行啊~