1336:【例3-1】找樹根和孩子
時間限制: 1000 ms 內存限制: 65536 KB
提交數: 6553 通過數: 3384
【題目描述】
給定一棵樹,輸出樹的根root,孩子最多的結點max以及他的孩子。
【輸入】
第一行:n(結點個數≤100),m(邊數≤200)。
以下m行:每行兩個結點x和y,表示y是x的孩子(x,y≤1000)。
【輸出】
第一行:樹根:root;
第二行:孩子最多的結點max;
第三行:max的孩子(按編號由小到輸出)。
【輸入樣例】
8 7
4 1
4 2
1 3
1 5
2 6
2 7
2 8
【輸出樣例】
4
2
6 7 8
思路:數據結構 樹`找出根節點,根節點肯定沒有父節點,所以父節點爲0的點就是根節點。找出孩子最多的節點,二重循環遍歷所有的節點,如果某個子結點存儲的父節點等於一層循環遍歷的數,說明二層循環遍歷的數是一層循環遍歷的數的父節點,子節點數++,最大的節點爲maxroot,打印結果,如果父節點爲maxroot,則子結點爲最多的那個.
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,tree[101]={0};
int main(){
int i,j,x,y,root,maxroot, ans = 0,maxn = 0;
cin >> n >> m;
for(i = 1; i <= m;i++){
cin >> x >> y;
tree[y] = x;//讀入數據,樹的特點:每一個節點都只有唯一的前驅元素,所以用數組來的存儲每個子節點的父節點。
}
for(i = 1; i <= n; i++){//找出根節點,根節點肯定沒有父節點,所以父節點爲0的點就是根節點。
if(tree[i] == 0)
{
root = i;
break;
}
}
for(i = 1; i <= n; i++)//找出孩子最多的節點,二重循環遍歷所有的節點,如果某個子結點存儲的父節點等於一層循環遍歷的數,說明二層循環遍歷的數是一層循環遍歷的數的父節點,子節點數++,最大的節點爲maxroot
{
ans = 0;
for(j = 0 ; j <= n; j++)
{
if(tree[j] == i)
ans++;
}
if(ans > maxn)
{
maxn = ans;
maxroot = i;
}
}
cout << root << endl << maxroot << endl;
for(i = 1; i <= n; i++)//打印結果,如果父節點爲maxroot,則子結點爲最多的那個
{
if(tree[i] == maxroot)
cout << i <<' ';
}
return 0;
}