题目描述
给出一棵有向树,一共有n个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数。
如样例,第一组的p节点为1,2,3;第二组的p节点为0。
输入
第一行为数据组数T。
每组数据第一行为表示树的节点数。
后面的行,每行两个数,代表节点编号和儿子节点的编号。
输出
每组数据输出一行,为一个整数,代表这棵树上p节点的个数。
样例输入
2 5 0 1 1 2 2 3 3 4 3 0 2 0 1
样例输出
3 1
来源
#include<iostream> #include<cstdio> #include<algorithm> #include<string> using namespace std; struct donser { int father; int son1; int son2; int num; }; int main() { int T; cin>>T; while(T--) { int num=0,j=0,cout_num=0; donser tree[200]; while(j<19) { tree[j].father=-1;tree[j].son1=-1;tree[j].son2=-1;tree[j].num=0; j++; } cin>>num;j=num-1; while(j--) { int m,n; cin>>m>>n; if(tree[m].son1==-1) { tree[m].son1=n; tree[m].num++; } else if(tree[m].son1!=-1) { tree[m].son2=n; tree[m].num++; } tree[n].father=m; tree[n].num++; } for(int i=0;i<num;i++) { int father=tree[i].father; int son1=tree[i].son1; int son2=tree[i].son2; int num=tree[i].num; if((father!=-1&&tree[father].num<=num)||father==-1) { if((son1!=-1&&tree[son1].num<=num)||son1==-1) { if((son2!=-1&&tree[son2].num<=num)||son2==-1) { cout_num++; } } } } cout<<cout_num<<endl; } return 0; }
原文地址:https://www.cnblogs.com/dzzy/p/8577021.html
时间: 2024-12-23 19:33:41