题目
统计节点个数
时间限制 1000 ms 内存限制 65536 KB
题目描述
给出一棵有向树,一共有 N(1<N≤1000)个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为 p 节点,现在你的任务是统计 p 节点的个数。
如样例,第一组的 p 节点为 1,2,3;第二组的 p 节点为 0。
输入格式
第一行为数据组数 T(1≤T≤100)。
每组数据第一行为 N 表示树的节点数。后面为 N−1 行,每行两个数x,y(0≤x,y<N),代表 y 是 x 的儿子节点。
输出格式
每组数据输出一行,为一个整数,代表这棵树上 p 节点的个数。
输入样例
2
5
0 1
1 2
2 3
3 4
3
0 2
0 1
输出样例
3
1
C++
#include"iostream"
#include"cstring"
using namespace std;
const int N = 1005;
int h[N],e[N*N],ne[N*N],idx;
int v[N];
int p[N];//存储i的父节点
int d[N];//存储i的度
int T,n;
void add(int a,int b){
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
int dfs(int u,int par){
v[u] = 1;
p[u] = par;//记录父节点
for(int i = h[u]; i!= -1; i=ne[i])
{
d[u] ++;//先累积出度
int t = e[i];
if(v[t] == 0){
dfs(t,u);
}
}
}
int main(){
cin >> T;
while(T--){
memset(h,-1,sizeof h);
memset(v,0,sizeof v);
memset(d,0,sizeof d);
idx = 0;
cin >> n;
for(int i = 0; i < n-1; i++){
int a,b;
cin >> a >> b;
add(a,b);
}
dfs(0,-1);//树只有从根节点出发才能连通整棵树,根节点的父节点为-1
int cnt = 0;
for(int i = 0; i < n; i++){
d[i] += p[i]== -1?0:1;//加上入度
// cout << i << " "<< d[i] << endl;
}
for(int i = 0; i < n; i++){
//max1用来计算结点i的父节点和子节点的度数最大值
//当父节点存在时,初始化为父节点的度数
//父节点不存在时,初始化为0
int max1 = p[i] == -1?0:d[p[i]];
for(int j = h[i]; j!= -1; j= ne[j])
{
int t = e[j];
max1 = max(max1,d[t]);
}
cout << i << " "<< max1 << ' ' << d[i]<< endl;
if(d[i]>=max1) cnt++;
}
cout << cnt << endl;
cout << "h[0]=" <<e[h[0]]<< endl;
}
}