一、题目
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、原题链接
二、解题报告
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);
}
};