猫猫和企鹅
猫猫和企鹅
题目描述
王国里有 n n n 个居住区,它们之间有 n − 1 n-1 n−1 条道路相连,并且保证从每个居住区出发都可以到达任何一个居住区,并且每条道路的长度都为 1 1 1。
除 1 1 1 号居住区外,每个居住区住着一个小企鹅,有一天一只猫猫从 1 1 1 号居住区出发,想要去拜访一些小企鹅。可是猫猫非常的懒,它只愿意去距离它在 d d d 以内的小企鹅们。
猫猫非常的懒,因此希望你告诉他,他可以拜访多少只小企鹅。
输入格式
第一行两个整数 n , d n, d n,d,意义如题所述。
第二行开始,共 n − 1 n - 1 n−1 行,每行两个整数 u , v u, v u,v,表示居民区 u u u 和 v v v 之间存在道路。
输出格式
一行一个整数,表示猫猫可以拜访多少只小企鹅。
样例 #1
样例输入 #1
5 1
1 2
1 3
2 4
3 5
样例输出 #1
2
提示
对于 100 % 100\% 100% 的数据,满足 1 ≤ n , d ≤ 1 0 5 1 \le n ,d \le 10^5 1≤n,d≤105,保证所有居民区从 1 1 1 开始标号。
题解
这是一个比较经典也比较简单的题,我们只需要确定树上每个点的深度即可,而根节点根据题目我们也可以判断出来
这里我提供了两种思路,供大家参考
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,d;
int ans;
std::vector<int> v1[N];
bool st[N];
void dfs(int x,int y){
if(y>d){
return ;
}
st[x]=true;
for(int i=0;i<v1[x].size();i++){
int j=v1[x][i];
if(!st[j]){
ans++;
// st[j]=true;
dfs(j,y+1);
// st[j]=false;
//ans--;
}
}
}
int main(){
cin>>n>>d;
for(int i=1;i<n;i++){
int u,v;
cin>>u>>v;
v1[u].push_back(v);
v1[v].push_back(u);
//这是一个无向图
}
dfs(1,1);
cout<<ans<<endl;
}//这是按照正常搜索进行的
//接下来我们可以提前将树的深度提前设置好
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
std::vector<int> v[N];
int depth[N];
bool st[N];
void dfs(int x){
st[x]=true;
for(int i=0;i<v[x].size();i++){
int j=v[x][i];
if(!st[j]){
depth[j]=depth[x]+1;
st[j]=true;
//一个点确定一个深度就可以了
dfs(j);
}
}
}
int main(){
int n,m;
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v1;
cin>>u>>v1;
v[u].push_back(v1);
v[v1].push_back(u);
}
depth[1]=0;
dfs(1);
//根据题意从根节点出发
int ans=0;
for(int i=2;i<=n;i++){
if(depth[i]<=m){
ans++;
}
}
cout<<ans<<endl;
return 0;
}

浙公网安备 33010602011771号