92. 统计节点个数
时间限制 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
代码:
/*
92. 统计节点个数
时间限制 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
Project: Tree_parent(树-双亲表示法)
Date: 2019/02/25
Author: Frank Yu
基本操作函数:
InitTree(Tree &T) 参数T,树根节点 作用:初始化树,先序递归创建
InsertParent(Tree &T, TElemType node1, TElemType node2) 插入双亲数组得到双亲域 参数:树T ,结点node1,结点node2 node1为node2的双亲 作用:使双亲数组中,node2对应的双亲域为node1的下标
GetIndegree(Tree &T, TElemType node) 得到某结点入度
GetOutdegree(Tree &T, TElemType node) 得到某结点出度
功能实现函数:
Getdegree(Tree T,TElemType node) 得到某点的度
CreateTree(Tree &T) 参数T,树根节点 作用:创建树,调用InsertParent
CountNode(Tree &T) 统计结点
*/
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<string>
#include<stack>
#include<queue>
#include<algorithm>
#include<iostream>
#define TElemType int
#define Max 1000
using namespace std;
//树的结点数据结构
typedef struct TNode
{
TElemType data;//数据域
int parent; //双亲
}TNode;
//树的数据结构
typedef struct Tree
{
TNode parent[Max];
int NodeNum;
}Tree;
//********************************基本操作函数********************************//
//创建树 规定数据域为#,则为空 双亲为-1,则为空
void InitTree(Tree &T,int N)
{
for (int i=0;i<N;i++)
{
T.parent[i].data = i;
T.parent[i].parent = -1;
}
T.NodeNum = N;
}
//插入双亲数组得到双亲域 参数:树T ,结点node1,结点node2 node1为node2的双亲 作用:使双亲数组中,node2对应的双亲域为node1的下标
bool InsertParent(Tree &T, TElemType node1, TElemType node2)
{
T.parent[node2].parent = node1;
return true;
}
//得到某结点入度 参数:树T,结点node
int GetIndegree(Tree &T, TElemType node)
{
if(T.parent[node].parent!=-1)return 1;//双亲只能有一个
else return 0; //根节点没有双亲,即没有入度
}
//得到某结点出度 参数:树T,结点node
int GetOutdegree(Tree &T, TElemType node)
{
int outdegree = 0;
for (int i = 0;i < T.NodeNum;i++)
{
if (T.parent[i].parent == node)outdegree++;
}
return outdegree;
}
//**********************************功能实现函数*****************************//
//得到某点的度
int Getdegree(Tree T,TElemType node)
{
return GetIndegree(T,node)+GetOutdegree(T,node);
}
//创建树,调用InsertParent
void CreateTree(Tree &T)
{
int parent=T.NodeNum-1;
TElemType node1,node2;
while (parent--)
{
cin >> node1>>node2;
InsertParent(T,node1,node2);
}
}
//统计结点
int CountNode(Tree &T)
{
int count=0;
bool flag;
for(int i=0;i<T.NodeNum;i++)//遍历,比较结点i的度及它的双亲和左右孩子的度
{
flag = true;//true是p结点
//cout<<Getdegree(T,i)<<" ";
if(T.parent[i].parent!=-1)//非根,比较父节点
{
if(Getdegree(T,i)<Getdegree(T,T.parent[i].parent))
{
flag=false;//比双亲的度小,不是p结点
continue;
}
}
for(int j=0;j<T.NodeNum;j++)//比较所有孩子结点的度
{
if(T.parent[j].parent==i)
{
//cout<<Getdegree(T,j)<<" ";
if(Getdegree(T,i)<Getdegree(T,j))
{
flag=false;
break;//比孩子度的小,不是p结点
}
}
}
if(flag)count++;
}
return count;
}
//主函数
int main()
{
int M,N;
Tree T;
cin>>M;
while(M--)
{
cin>>N;
InitTree(T,N);
CreateTree(T);
cout<<CountNode(T)<<endl;
}
return 0;
}