题目描述
GX养的一只仓鼠最近跑进了一个神秘的城堡里,他准备在这个有n个房间的城堡中抓捕他的仓鼠,他在房间0放了一块食物,根据抓鼠攻略,这块食物可以吸引距离它D的仓鼠,但是仓鼠还是没有出现,现在给你一张这个城堡的地图,上面标有各个房间的关系,已知每个房间都相连且距离为1,GX想知道他的仓鼠可能出现在哪些房间,请输出这些房间的总数
输入
第一行输入n(0< n <=100000)和D(0< D < n)
接下来的n-1行为房间的连接关系,每行有两个数x,y代表房间x与房间y相邻
输出
对于每组数据,输出一个数,表示仓鼠可能出现的房间的数量
样例输入
10 2
0 1
0 2
0 3
1 4
1 5
2 6
3 7
4 8
6 9
样例输出
2
思路
因为题中说明有n个房间和n-1条通道,故可以将它们看成一棵树,然后运用从房间0开始,运用深度优先搜索或者广度优先搜索进行遍历深度为D的房间,并统计数量。
#include <iostream>
#include <vector>
#include <cstring>
#include <queue>
#include <fstream>
using namespace std;
int d;
int count;
vector<int> edges[100005];
bool vis[100005];
//深度优先遍历
void dfs(int v, int step)
{
if(step == d)
{
return ;
}
else
{
vis[v] = true;
count ++;
for(int i = 0; i < edges[v].size(); ++ i)
{
if(!vis[edges[v][i]])
{
dfs(edges[v][i], step + 1);
}
}
}
}
int main()
{
//ifstream cin("data.in");
int n;
while(cin >> n >> d)
{
count = 0;
d ++;
memset(vis, false, sizeof(bool) * n);
for(int i = 0; i < n; i ++)
{
edges[i].clear();//注意初始化,负责会出错
}
for(int i = 0; i < n-1; ++ i)
{
int x, y;
cin >> x >> y;
edges[x].push_back(y);
}
dfs(0, 0);
cout << n - count << endl;//count为以遍历的房间,即距离房间0距离小于等于D的房间
}
return 0;
}