题目来源:HDU 5326
简要题目分析:
公司中有n个职员,每个人(除了老板)都有一个直接上司,上司的上司而且是你的间接上司(树形图),给定k,求有多少人管理k个下属(有多少个下属节点为k)。与一般的并查集不同,该题要求的是并查集中子节点为k的节点数,因此在基础并查集上要做一些改变。
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include <queue>
#include <string.h>
#include <stack>
#include <vector>
#define LL long long
const int MAXN=100+5;
int pre[MAXN]; //记录前驱节点
int sum[MAXN]; //记录每个节点的下属节点个数
void findRoot(int x)
{
int cur=x;
int indegree;
while(x!=pre[x])
x=pre[x];
while(cur!=x)
{
indegree=pre[cur];
sum[indegree]++; //核心代码,模拟压缩路径,但是并没有压缩,而是对节点进行计数
cur=indegree;
}
}
int main()
{
int n,k;
while(~scanf("%d %d",&n,&k))
{
memset(pre,0,sizeof(pre));
memset(sum,0,sizeof(sum));
int i;
int ans=0;
for(i=1;i<=n;++i)
pre[i]=i;
for(i=1;i<=n-1;++i)
{
int a,b;
scanf("%d %d",&a,&b);
pre[b]=a; //与一般合并并查集不同,这里采取直接记录前驱节点的方法。
}
for(i=1;i<=n;++i)
findRoot(i);
for(i=1;i<=n;++i)
{
if(sum[i]==k)
ans++;
}
printf("%d\n",ans);
}
return 0;
}