洛谷题单指南-图论之树-P5908 猫猫和企鹅
原题链接:https://www.luogu.com.cn/problem/P5908
题意解读:求以节点1为根,深度<=2的子树的节点数,再减去根节点自己,设根节点深度是0。
解题思路:
从根节点开始DFS,DFS过程记录三个参数
u:子树的根 parent:父节点 depth:u距离1的深度
每次DFS要计算以u为根的子树的节点数,可以根据递归得到:
以u为根的子树的节点数 = u自己 + u所有邻接点为根的子树的节点数
注意:要控制在搜索的节点深度不超过d。
100分代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 100005;
vector<int> g[N];
int n, d;
//以u为根节点深度<=d的子树的节点数
//u:子树的根 parent:父节点 depth:u距离1的深度
int dfs(int u, int parent, int depth)
{
int sum = 1; //u自己算1个
if(depth == d) return sum;
for(auto v : g[u])
{
if(v == parent) continue;
sum += dfs(v, u, depth + 1); //将u所有邻接点所形成子树的节点数累加
}
return sum;
}
int main()
{
cin >> n >> d;
int u, v;
for(int i = 1; i <= n; i++)
{
cin >> u >> v;
g[u].push_back(v);
g[v].push_back(u);
}
cout << dfs(1, 0, 0) - 1; //要减去节点1自身
return 0;
}
浙公网安备 33010602011771号