洛谷 U273725:树的叶子节点
【题目来源】
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/