猫猫和企鹅

猫猫和企鹅

题目描述

王国里有 n n n 个居住区,它们之间有 n − 1 n-1 n1 条道路相连,并且保证从每个居住区出发都可以到达任何一个居住区,并且每条道路的长度都为 1 1 1

1 1 1 号居住区外,每个居住区住着一个小企鹅,有一天一只猫猫从 1 1 1 号居住区出发,想要去拜访一些小企鹅。可是猫猫非常的懒,它只愿意去距离它在 d d d 以内的小企鹅们。

猫猫非常的懒,因此希望你告诉他,他可以拜访多少只小企鹅。

输入格式

第一行两个整数 n , d n, d n,d,意义如题所述。

第二行开始,共 n − 1 n - 1 n1 行,每行两个整数 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 1n,d105,保证所有居民区从 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;

}

posted @ 2023-07-11 09:57  du463  阅读(207)  评论(0)    收藏  举报  来源