题意:
给一个树型关系图,父亲结点管理儿子结点,问有多少个点,恰好管理k个点。
解析:
并查集,用son[u]来记录节点u有多少个孩子节点,每次联合并查集,就沿着父节点向上更新,最后统计有多少个恰好等于k的son[u]的个数。
my code
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 1005;
int n, k;
int pa[N], son[N];
void init() {
for(int i = 1; i <= n; i++) {
pa[i] = i;
son[i] = 0;
}
}
void update(int u) {
son[u]++;
if(u == pa[u]) return ;
update(pa[u]);
}
void Union(int a, int b) {
pa[b] = a;
update(pa[b]);
}
int main() {
while(scanf("%d%d", &n, &k) != EOF) {
init();
int u, v;
for(int i = 1; i < n; i++) {
scanf("%d%d", &u, &v);
Union(u, v);
}
int ans = 0;
for(int i = 1; i <= n; i++) {
if(son[i] == k) ans++;
}
printf("%d\n", ans);
}
return 0;
}