标签:
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5326
这题应该是本周二多校赛中,最简单的一道题目了。
解题思路: 就是回根。 用一个数组 root[i] = j 表示 i 的上级是 j , 对于每个输入的关系都做这样的处理。然后遍历每个编号直到root[i] 的结果为0 (因为根没有上级,所以根为0),在往根回退的过程中,用一个数组 cnt[i] 表示经过i这个点的次数。 最后就是遍历 cnt[i],累加 cnt[i] = k 的结果即可AC
#include <bits/stdc++.h>
using namespace std;
const int MAX = 100+2;
int root[MAX] = {};
int cnt[MAX] = {};
// 回根
int getRoot(int n, int k)
{
for(int i=1; i<=n; ++i)
{
int t = i;
while(root[t])
{
cnt[ root[t] ]++; // 每经过上级,那么上级就累加,有点像上级汇报一样
t = root[t];
}
}
int ans = 0;
for(int i=1; i<=n; ++i)
{
if (cnt[i] == k)
ans++;
}
return ans;
}
int main(void)
{
//freopen("in.txt", "r", stdin);
int n, k;
while(cin>>n>>k)
{
memset(root, 0, sizeof(root));
memset(cnt, 0, sizeof(cnt));
int u, v;
for(int i=1; i<n; ++i)
{
scanf("%d%d", &u, &v);
root[v] = u;
}
// 回根
printf("%d\n", getRoot(n, k));
}
return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 http://blog.csdn.net/core__code
标签:
原文地址:http://blog.csdn.net/core__code/article/details/47137933