题目大意:给出n和deep, 然后给出n - 1个关系(关系图为有向无环图,0~n - 1), 然后找出和0的关系大于deep的点有多少个。
解题思路:用邻接表(借助vector)保存关系, dfs搜索, 当d >= 2时返回, 然后遍历一遍所有点, 统计没有搜索过的点。
#include <stdio.h>
#include <string.h>
#include <vector>
using namespace std;
const int N = 100005;
int n, deep, vis[N];
vector<int> vec[N];
void find(int k, int d) {
vis[k] = 1;
if (d >= deep) return ;
vector<int>::iterator i;
for (i = vec[k].begin(); i != vec[k].end(); i++)
find(*i, d + 1);
}
int main() {
int cas, a, b, cnt;
scanf("%d", &cas);
while (cas--) {
scanf("%d%d", &n, &deep);
cnt = 0;
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++)
vec[i].clear();
for (int i = 1; i < n; i++) {
scanf("%d%d", &a, &b);
vec[a].push_back(b);
}
find(0, 0);
for (int i = 0; i < n; i++)
if (!vis[i]) cnt++;
printf("%d\n", cnt);
}
return 0;
}