东方博宜OJ 2188:找树根 ← 邻接表

【题目来源】
https://oj.czos.cn/p/2188

【题目描述】
一棵树有 n 个结点,已知树上所有的父子结点关系,请问该树的根是几号结点,哪个结点的子结点最多,该结点有哪些子结点。

【输入格式】
第一行,有 1 个整数 n 代表结点数量(1<n≤100)
接下来若干行;每行两个结点 x 和 y,表示 y 是 x 的孩子(1≤x,y≤1000)
请注意:树上结点的编号不一定是连续的。

【输出格式】
第一行输出树根的编号。
第二行输出孩子最多的结点编号(如果有多个结点的子结点都是最多的,则输出编号最大的那个)。
第三行输出第二行求出的孩子最多的结点,有哪些孩子,按照编号从小到大,输出这些孩子的编号,用空格隔开。​​​​​​​

【输入样例】
5
4 1
4 2
1 3
1 5​​​​​​​

【输出样例】
4
4
1 2

【数据范围】
1<n≤100

【算法分析】
● 本文代码的关键判断语句​​​​​​​

if(v[x].size()>v[mx].size() || (v[x].size()==v[mx].size() && x>mx)) {
    mx=x;
}

【算法代码】
本题代码与“AcWing 1254:找树根和孩子”(​​​​​​​https://blog.csdn.net/hnjzsyjyj/article/details/140138335)基本一致,只是输入格式不同。

#include<bits/stdc++.h>
using namespace std;

const int N=1e3+5;
vector<int> v[N];
int fa[N];
int n,x,y,mx=0;

int main() {
    memset(fa,-1,sizeof fa);
    cin>>n;
    for(int i=1; i<n; i++) {
        cin>>x>>y;
        fa[y]=x;
        v[x].push_back(y);
        if(v[x].size()>v[mx].size() || (v[x].size()==v[mx].size() && x>mx)) {
            mx=x;
        }
    }

    int root=x;
    while(fa[root]!=-1) {
        root=fa[root];
    }
    cout<<root<<endl;
    cout<<mx<<endl;

    sort(v[mx].begin(),v[mx].end());
    for(int i=0; i<v[mx].size(); i++) {
        cout<<v[mx][i]<<" ";
    }
    return 0;
}

/*
in:
8
4 1
4 2
1 3
1 5
2 6
2 7
2 8

out:
4
2
6 7 8
*/





【参考文献】
https://blog.csdn.net/hnjzsyjyj/article/details/140138335
https://blog.csdn.net/weixin_73739312/article/details/129054416
https://blog.csdn.net/hnjzsyjyj/article/details/155581179
https://blog.csdn.net/hnjzsyjyj/article/details/155606132






posted @ 2025-12-10 09:58  Triwa  阅读(15)  评论(0)    收藏  举报