P5908

Annaprincess發表於2024-08-04

P5908 貓貓和企鵝

題目描述

王國裡有 n 個居住區,它們之間有 n−1條道路相連,並且保證從每個居住區出發都可以到達任何一個居住區,並且每條道路的長度都為 1

1 號居住區外,每個居住區住著一個小企鵝,有一天一隻貓貓從 1號居住區出發,想要去拜訪一些小企鵝。可是貓貓非常的懶,它只願意去距離它在 d以內的小企鵝們。

貓貓非常的懶,因此希望你告訴他,他可以拜訪多少隻小企鵝。

輸入格式

第一行兩個整數 n,d意義如題所述。

第二行開始,共 n−1 行,每行兩個整數 u,v,表示居民區 uv 之間存在道路。

輸出格式

一行一個整數,表示貓貓可以拜訪多少隻小企鵝。

輸入輸出樣例

輸入 #1
5 1
1 2
1 3
2 4
3 5
輸出 #1
2

說明/提示

對於 100% 的資料,滿足 1≤n,d≤105,保證所有居民區從 1開始標號。

分析:

樹用無向圖存-->鄰接表

然後dfs從貓的位置即1號位開始搜

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
const int M=200006;
int n,d;
int h[N];
int e[M];
int ne[M];
int idx;
bool st[N];
int cnt=0;//可拜訪
void add(int a,int b){
e[idx]=b;
ne[idx]=h[a];
h[a]=idx;
idx++;
}
void dfs(int t,int b){//點,距離
if(b==d){
//現在距離到d退出遞迴
return;
}
for(int i=h[t];i!=-1;i=ne[i]) {
int f=e[i];
if(!st[f]){
st[f]=true;
cnt++;//小於等於d都會加1
dfs(f,b+1);//遍歷下一層點
}
}
}
int main(){
cin>>n>>d;//n個點,d距離
int a,b;
memset(h,-1,sizeof h) ;
for(int i=1;i<n;i++){
cin>>a>>b;
add(a,b);
add(b,a);
}
st[1]=true;//第一個點是貓的位置不能返回
dfs(1,0);
cout<<cnt;
return 0;
}