信息学奥赛一本通 1336:【例3-1】找树根和孩子

【题目链接】

ybt 1336:【例3-1】找树根和孩子

【题目考点】

1. 树 双亲表示法

设pa数组,pa[i]表示第i结点的双亲结点的编号。

【解题思路】

解法1:双亲表示法

用双亲表示法保存整棵树的信息,pa[i]表示第i结点的双亲结点的编号。遍历pa数组求出每个结点的度(树中结点的度就是该结点孩子的数量),得到度最大的结点的编号。然后遍历pa数组,输出该结点的孩子。

【题解代码】

解法1:双亲表示法

#include <bits/stdc++.h>
using namespace std;
int par[101], deg[101];//par[i]:表示结点i的双亲, deg[i]:表示结点i的度
int main()
{
    
    
    int n, m, x, y, root, maxDeg = 0, maxNum = 1;//root:表示根结点编号,maxNum:度最高结点编号,maxDeg:表示度最高结点的度,即孩子对多的结点的孩子数
    cin >> n >> m;
    for(int i = 1; i <= m; ++i)
    {
    
    
        cin >> x >> y;
        par[y] = x;//y的双亲是x 
    }
    for(int i = 1; i <= n; ++i)
    {
    
    
        if(par[i] == 0)//双亲是0的结点是根结点 
            root = i;
        deg[par[i]]++;//结点i的双亲的度加1
    }
    cout << root << endl;
    for(int i = 1; i <= n; ++i)//查找度最大的结点
    {
    
    
        if(deg[i] > maxDeg)
        {
    
    
            maxDeg = deg[i];//最大度数 
            maxNum = i;//度数最大的顶点的编号 
        }
    }
    cout << maxNum << endl;
    for(int i = 1; i <= n; ++i)//顺序遍历各个结点,看哪些结点是度最大结点的孩子
    {
    
    
        if(par[i] == maxNum)
            cout << i << ' ';
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lq1990717/article/details/125597956