Leetcode 1443. 收集树上所有苹果的最少时间 题解

题目链接: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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_42396397/article/details/106117743