leetcode2368. 受限条件下可到达节点的数目-medium

1 题目:受限条件下可到达节点的数目

官方标定难度:中

现有一棵由 n 个节点组成的无向树,节点编号从 0 到 n - 1 ,共有 n - 1 条边。

给你一个二维整数数组 edges ,长度为 n - 1 ,其中 edgesi = ai, bi 表示树中节点 ai 和 bi 之间存在一条边。另给你一个整数数组 restricted 表示 受限 节点。

在不访问受限节点的前提下,返回你可以从节点 0 到达的 最多 节点数目。

注意,节点 0 不 会标记为受限节点。

示例 1:

输入:n = 7, edges = \[0,1,1,2,3,1,4,0,0,5,5,6], restricted = 4,5

输出:4

解释:上图所示正是这棵树。

在不访问受限节点的前提下,只有节点 0,1,2,3 可以从节点 0 到达。

示例 2:

输入:n = 7, edges = \[0,1,0,2,0,5,0,4,3,2,6,5], restricted = 4,2,1

输出:3

解释:上图所示正是这棵树。

在不访问受限节点的前提下,只有节点 0,5,6 可以从节点 0 到达。

提示:

2 <= n <= 105

edges.length == n - 1

edgesi.length == 2

0 <= ai, bi < n

ai != bi

edges 表示一棵有效的树

1 <= restricted.length < n

1 <= restrictedi < n

restricted 中的所有值 互不相同

2 solution

dfs 搜索没有限制的节点即可

代码

cpp 复制代码
class Solution {
    static int const N = 1e5 + 1;
    vector<int> e[N];
    bitset<N> rest;

    int dfs(int u, int p) {
        int ans = 1;
        for (int v: e[u]) {
            if (v != p && !rest.test(v)) {
                ans += dfs(v, u);
            }
        }
        return ans;
    }

public:
    int reachableNodes(int n, vector<vector<int>> &edges, vector<int> &restricted) {
        for (auto &x: edges) {
            e[x[0]].push_back(x[1]);
            e[x[1]].push_back(x[0]);
        }

        for (int v: restricted) rest.set(v);

        return dfs(0, -1);
    }
};

结果

相关推荐
Jasmine_llq1 分钟前
《P17462 [GESP202609 八级] 末班车》
算法·dijkstra 算法·最大化版本,求最长可行值·建反向图(逆图 / 反转边)·多源 dijkstra 思想·对每个终点单独跑一遍djst·离线预处理 + 在线查询
50万马克的面包5 分钟前
数据结构01-数据结构概念与复杂度-博客稿
数据结构
Logic10128 分钟前
C语言/数据结构贪心算法题解:字符串趋同——逐位统计最高频率求最小修改代价
c语言·数据结构·贪心算法·字符串·时间复杂度·频率统计·算法题
the3clipse1 小时前
H.265熵编码核心:CABAC自适应二进制算术编码详解——如何将语法元素高效压缩为比特流
人工智能·算法·视频编码·h.265·hevc·cabac·cavlc
CQU_JIAKE1 小时前
10.4【A】
算法
Godspeed Zhao1 小时前
现代智能雷达技术19——算法(5)
算法
(Charon)1 小时前
【C++面试】RAII到底是什么:从资源管理理解C++对象生命周期
c++·算法·面试
无名猿1 小时前
成员初始化列表与初始化顺序陷阱:按声明顺序,不是书写顺序
c++·现代c++·语法基础
Omics Pro1 小时前
之江实验室NAR|虚拟细胞3阶段训练范式
数据库·人工智能·算法·机器学习·自然语言处理
Tisfy1 小时前
LeetCode 0678.有效的括号字符串:O(n)+O(1)一次遍历
算法·leetcode·字符串·题解·贪心·括号匹配