一、题目
1、题目描述
现有一棵由
n
个节点组成的无向树,节点编号从0
到n - 1
,共有n - 1
条边。给你一个二维整数数组
edges
,长度为n - 1
,其中edges[i] = [ai, bi]
表示树中节点ai
和bi
之间存在一条边。另给你一个整数数组restricted
表示 受限 节点。在不访问受限节点的前提下,返回你可以从节点
0
到达的 最多 节点数目。注意,节点
0
不 会标记为受限节点。
2、接口描述
class Solution {
public:int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {}
};
3、原题链接
2368. 受限条件下可到达节点的数目
二、解题报告
1、思路分析
先存图,然后标记限制节点
然后从根开始往下深搜即可,对于父节点和标记节点不进行访问
2、复杂度
时间复杂度: O(n)空间复杂度:O(n)
3、代码详解
class Solution {
public:
bool vis[100005];int reachableNodes(int n, vector<vector<int>>& edges, vector<int>& restricted) {memset(vis, 0, sizeof vis);vector<vector<int>> g(n);for(auto x : restricted) vis[x] = 1;for(auto& e : edges) g[e[0]].emplace_back(e[1]), g[e[1]].emplace_back(e[0]);function<int(int, int)> dfs = [&](int x, int fa)->int{int res = 1;for(auto y : g[x]) if(!vis[y] && y != fa) res += dfs(y, x);return res;};return dfs(0, -1);}
};