洛谷 U273725:树的叶子节点

发布于:2025-04-09 ⋅ 阅读:(88) ⋅ 点赞:(0)

【题目来源】
https://www.luogu.com.cn/problem/U273725

【题目描述】
已知一棵树,有 n 个结点,
编号 1 至 N,其中 1 号是根。求树的叶子节点数。

【输入格式】
第一行一个数 N (
1<=N<=1000)
接下来 N 行,每行 N 个 1 或 0,第 i 第 j 列是 1,表示 i, j 两点有边,否是没有边。

【输出格式】
树的叶子节点数及它们的编号。

【输入样例】
10
0 1 1 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0
1 0 0 0 1 1 0 0 0 1
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 1 1 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 0 0​​​​​​​

【输出样例】
5
4 5 8 9 10​​​​​​​

【算法分析】
● 判断是否为叶子结点的核心代码如下所示。

if(i==1 && cnt==0) v.push_back(i);
else if(i!=1 && cnt==1) v.push_back(i);

● 例如,给定如下所示样例。

4
0 1 1 0
1 0 0 0
1 0 0 1
0 0 1 0

输出结果为:

2
2 4


【算法代码】

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

const int maxn=1e3+5;
int a[maxn][maxn];

int main() {
    int n;
    cin>>n;
    for(int i=0; i<n; i++) {
        for(int j=0; j<n; j++) {
            cin>>a[i][j];
        }
    }

    vector<int> v;

    for(int i=1; i<=n; i++) {
        int row=i-1;
        int cnt=0;
        for(int j=0; j<n; j++) {
            if(a[row][j]==1) cnt++;
        }

        if(i==1 && cnt==0) v.push_back(i);
        else if(i!=1 && cnt==1) v.push_back(i);
    }

    sort(v.begin(),v.end());

    cout<<v.size()<<endl;
    for(auto i=0; i<v.size(); i++) {
        cout<<v[i]<<" ";
    }
    cout<<endl;

    return 0;
}



/*
in:
10
0 1 1 0 0 0 0 0 0 0
1 0 0 1 0 0 0 0 0 0
1 0 0 0 1 1 0 0 0 1
0 1 0 0 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 1 0 0 0 1 0 0 0
0 0 0 0 0 1 0 1 1 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 1 0 0 0 0 0 0 0

out:
5
4 5 8 9 10
*/




【参考文献】
https://www.luogu.com.cn/article/2h6t1unq
https://blog.csdn.net/qq_38499859/article/details/78857873
https://blog.csdn.net/weixin_46247544/article/details/106534263
https://www.luogu.com.cn/problem/P11962
https://www.acwing.com/problem/content/4949/



 


网站公告

今日签到

点亮在社区的每一天
去签到