不是VIP会员,不能显示答案

题目解答

题目:
(家谱树》小明的家谱中共有n(编号为1到n)个人,相互关系构成了一棵树。现给出家谱中人员之间的相互关系。求出家谱中子孙(不包括自己)共有m个的人数。
输入:
第一行2个整数n(1≤n≤100)和m(1≤n≤100)。
接下来n-1行,每行两个整数x,y(1≤x,y ≤100),表示x是y的父亲
输出:
输出一行1个整数,表示家谱中子孙共有m个的人数。
输入样例:
9 2
1 2
1 6
2 3
2 4
2 5
6 7
7 8
7 9
输出样例:
2
算法分析:本题主要通过枚举和深搜实现。由于家谱树中的每个结点的子孙结点等于其子结点总数加上各子结点的子孙结点总数。所以在实现时依次枚举各结点。并通过深搜统计以该结点为根的子树结点数之和ans(不包过根结点),如果ans等于m。则给结果cnt加1。
#include <iostream>
#include <cstring>
using namespace std;
int ans,a[101][101],c[101];
//a[i][j]表示编号为i的人的第j个孩子的编号
//c[i]存储编号为i的人的孩子总数
void dfs(int i)
{
	if ( c[i]==0 )
		return ;
	ans += c[i];
	for (int j=1; j<=c[i]; j++)
	   dfs(a[i][j]) ;
} 
int main()
{
	int n,m,x,y,cnt;
	cin>>n>>m;
	memset(a,0,sizeof(a));
	memset(c,0,sizeof(c));
	for (int i=1; i<=n-1; i++)
	{
		cin>>x>>y;
		 c[x]++ ;		
		a[x][c[x]]=y;
	}
	cnt=0;
	for (int i=1; i<=n; i++)
	{
		 ans=c[i] ;
		for (int j=1; j<=c[i]; j++)
			dfs(a[i][j]);
		if ( ans==m )
			cnt++;
	}
	cout<<cnt<<endl;	
	return 0;
}
考点:
分析:
解答:
评论:
老师: