更改网站标题,网站制作多少钱公司,wordpress 讨论主题,博客网站首页设计题干#xff1a;
L2-2 小字辈#xff08;左子右兄加强版#xff09; #xff08;25 分#xff09;
本题给定一个庞大家族的家谱#xff0c;要请你给出最小一辈的名单。 需要注意的是#xff0c;家族成员的输入方式#xff0c;是按照“Left-child Right-sibling”
L2-2 小字辈左子右兄加强版 25 分
本题给定一个庞大家族的家谱要请你给出最小一辈的名单。 需要注意的是家族成员的输入方式是按照“Left-child Right-sibling”左儿子 右兄弟的格式 【敲黑板】sibling的意思是兄弟/姐妹是亲兄弟不是“表兄弟”2019年春季PAT中不认识单词sibling的孩纸请牢记……注本题是在浙江大学陈越老师的GPLT-2018决赛L2-2题目“小字辈”题意基础上改编而成。
输入格式:
输入在第一行给出家族人口总数 N不超过 100 000 的正整数 —— 简单起见我们把家族成员从 1 到 N 编号。 随后的N行每行给出1名家族成员的编号以及他的亲属关系格式为3个以空格间隔的整数A B C 其中的A范围1N是1名家族成员编号每行的编号必定各不相同B的范围是0N当B不为0表示A有儿子BC的范围是0N当C不为0表示A有兄弟C。 题目保证输入是正确的即只有一个家族没有分离成家族群且家族中只有一位老祖宗老祖宗即他不是任何其他人的儿子
输出格式:
首先输出最小的辈分老祖宗的辈分最大、数值为 1子孙的辈分数值逐级递增1。 然后在第二行按递增顺序输出辈分最小的成员的编号。编号间以一个空格分隔行首尾不得有多余空格。
输入样例1:
5
1 2 0
2 4 3
3 0 0
4 0 5
5 0 0输出样例1:
3
4 5输入样例2:
5
2 5 3
1 2 0
3 0 0
4 0 0
5 0 4输出样例2:
3
4 5
解题报告 首先用入度为0的特点找到根节点然后递归维护每个节点的深度。最后按要求输出就行了。
AC代码
#includecstdio
#includeiostream
#includealgorithm
#includequeue
#includestack
#includeset
#includemap
#includecmath
#includecstring
typedef long long ll;
using namespace std;
const int MAX 2e5 6;
int n;
int no[MAX],son[MAX],bro[MAX];
pairint,int pr[MAX];
int dep[MAX];
bool bk[MAX];
int ans2[MAX];
void go(int rt) {if(pr[rt].first 0 pr[rt].second 0) return ;if(pr[rt].first ! 0) {dep[pr[rt].first] dep[rt] 1;go(pr[rt].first);}if(pr[rt].second ! 0) {dep[pr[rt].second] dep[rt] ;go(pr[rt].second);}
}
int main()
{cinn;for(int i 1; in; i) {scanf(%d%d%d,no[i],son[i],bro[i]);pr[no[i]] make_pair(son[i],bro[i]);bk[son[i]]1;bk[bro[i]]1;}int rt1;for(int i 1; in; i) {if(bk[i] 0){rt i;break;}}dep[rt] 1;go(rt);int ans1 0;for(int i 1; in; i) {ans1 max(ans1,dep[i]);}int tot 0;for(int i 1; in; i) {if(dep[i] ans1) {ans2[tot] i;}}sort(ans21,ans2tot1);printf(%d\n,ans1);for(int i 1; itot; i) {printf(%d%c,ans2[i],i tot ? \n : );}return 0 ;
}