做法
-
首先记录一下每一个节点的父亲。
-
对于每一个有苹果的节点,顺着父节点一直往上找,每走一步答案
+1
,直到某个父节点访问过或者到头。记得将最后的答案*2
,因为是来回。
时间复杂度
最坏情况下,每个点遍历两次,所以$O(n)$
空间复杂度
由于开了两个额外的数组,所以$O(n)$
class Solution {
public:
int minTime(int n, vector<vector<int>>& edges, vector<bool>& hasApple) {
int fa[100010] = {0};
bool vis[100010] = {0};
fa[0] = -1;
for (auto v : edges) {
fa[v[1]] = v[0];
}
int ans = 0;
for (int i = 0; i < hasApple.size(); i++) {
if (!i) continue;
if (hasApple[i] && !vis[i]) {
int node = i;
vis[node] = true, ans++;
while (fa[node] != 0 && !vis[fa[node]]) {
node = fa[node];
vis[node] = true, ans++;
}
}
}
return ans * 2;
}
};