一天早上小明醒来时发现他的宠物仓鼠不见了。 他在房间寻找但是没找到仓鼠。 他想用奶酪诱饵去找回仓鼠。 他把奶酪诱饵放在房间并且等待了好几天。 但是可怜的小明除了老鼠和蟑螂没见到任何东西。 他找到学校的地图发现地图上没有环路,并且学校里的每个站点都可以从他的房间到达。 奶酪诱饵的手册提到在距离D之内宠物必定会被吸引回来. 你的任务是帮助小明从给定的地图中有多少可能的站点是仓鼠的藏身处. 假定仓鼠一直藏在学校的某个站点并且两个相邻站点间的距离都是1个单位。
Input输入包含多组数据。 第一行一个整数T (0<T<=10), 表示测试数据的组数。 每组数据, 第一行包含两个整数 N (0<N<=100000) 和 D(0<D<N). N 是学校里的站点数, D 是诱饵的影响距离。 下面 N-1行为地图描述, 每行一对 x 和 y(0<=x,y<N), 用一个空格隔开, 表示x和y两个站点是相邻的。小明的房间用0表示。
Output对于每组数据,输出可能找到仓鼠的站点数。Sample Input
1 10 2 0 1 0 2 0 3 1 4 1 5 2 6 3 7 4 8 6 9
Sample Output
2
这个题目说的我有点晕,,看了好几遍才明白大意,题目的大意::两邻的两点的距离为1;给出n个点,n-1个点相邻,0是小明家的位置,距离是D。。然后当两点之间的距离小于等于D时,宠物可以被吸引过来,否则不可以,,判断宠物的可能藏身地
AC代码:
#include<iostream> #include<cstdio> #include<vector> #include<cstring> using namespace std; int n,d; vector<int >ve[100000+1]; int mark[100000+1]; void dfs(int x,int step){ if(step==d){ return ; } for(int i=0;i<ve[x].size();i++){ if(mark[ve[x][i]]==0){ mark[ve[x][i]]=1; dfs(ve[x][i],step+1); } } } int main(){ int tt; scanf("%d",&tt); while(tt--){ scanf("%d%d",&n,&d); int x,y; for(int i=0;i<n-1;i++){ scanf("%d%d",&x,&y);//用scanf输入不然会TLE ve[x].push_back(y); //与x相连接的点 } memset(mark,0,sizeof(mark)); mark[0]=1; dfs(0,0); int ans=0; for(int i=0;i<n;i++){ if(mark[i]==0) ans++; } printf("%d\n",ans); for(int i=0;i<n;i++) ve[i].clear(); } return 0; }