洛谷题单指南-图论之树-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;
}

 

posted @   五月江城  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?
历史上的今天:
2024-02-28 洛谷题单指南-二分查找与二分答案-P2249 【深基13.例1】查找
点击右上角即可分享
微信分享提示