统计结点个数(双亲表示法)-北邮2013研究生复试

本文介绍了一种算法,用于统计有向树中被称为p节点的特定类型节点的数量。p节点定义为其度(入度+出度)不小于其所有子节点及父节点的度。文章提供了详细的算法实现,包括初始化树、插入双亲节点、获取节点度数及统计p节点等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址:http://10.105.242.80/problem/p/92/

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;
}

更多数据结构与算法实现:数据结构(严蔚敏版)与算法的实现(含全部代码)

有问题请下方评论,转载请注明出处,并附有原文链接,谢谢!如有侵权,请及时联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lady_killer9

感谢您的打赏,我会加倍努力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值