题目链接:https://leetcode-cn.com/problems/minimum-time-to-collect-all-apples-in-a-tree/
这周周赛的一道题,但是当时没弄出来。做深搜tag正好碰上了就刚一刚
开始设计的dfs是 int 型,返回步数,但是不知道为啥TLE:
class Solution {
public:
bool vis[100005];
int dfs(int pos, vector<vector<int>> e, vector<bool> hasApple) {
if(vis[pos]) {
return 0;
}
vis[pos] = true;
int ans = 0;
for(int i = 0; i < e[pos].size(); i++) {
ans += dfs(e[pos][i], e, hasApple);
}
if((ans > 0 || hasApple[pos]) && pos != 0) {
return ans + 2;
}
return ans;
}
int minTime(int n, vector<vector<int>>& edges, vector<bool>& hasApple) {
vector<vector<int>>e(n, vector<int>(0));
for(int i = 0; i < edges.size(); i++) {
int from = min(edges[i][0], edges[i][1]);
int to = max(edges[i][0], edges[i][1]);
e[from].push_back(to);
e[to].push_back(from);
}
return dfs(0, e, hasApple);
}
};
之后把dfs改成 bool 型返回是否有苹果,最后主函数算步数过了…
这道题要注意 from 和 to 结点都要互相 push_back,因为给的样例只保证数值大小,并不是深度大小,所以可能第一个给的是终止点,第二个给的是起始点。
代码如下:
class Solution {
public:
bool vis[100005];
int res = 0;
bool dfs(int pos, vector<vector<int>>& e, vector<bool>& hasApple) {
if(vis[pos]) {
return false;
}
vis[pos] = true;
for(int i = 0; i < e[pos].size(); i++) {
bool t = dfs(e[pos][i], e, hasApple);
hasApple[pos] = hasApple[pos] || t;
}
if(pos != 0 && hasApple[pos]) {
res++;
}
return hasApple[pos];
}
int minTime(int n, vector<vector<int>>& edges, vector<bool>& hasApple) {
vector<vector<int>>e(n, vector<int>(0));
for(int i = 0; i < edges.size(); i++) {
int from = min(edges[i][0], edges[i][1]);
int to = max(edges[i][0], edges[i][1]);
e[from].push_back(to);
e[to].push_back(from);
}
dfs(0, e, hasApple);
return 2 * res;
}
};