美文网首页
Leetcode 1443. 收集树上所有苹果的最少时间(无向树

Leetcode 1443. 收集树上所有苹果的最少时间(无向树

作者: 进击的Lancelot | 来源:发表于2020-06-24 21:11 被阅读0次

问题描述

给你一棵有 n 个节点的无向树,节点编号为 0 到 n-1 ,它们中有一些节点有苹果。通过树上的一条边,需要花费 1 秒钟。你从 节点 0 出发,请你返回最少需要多少秒,可以收集到所有苹果,并回到节点 0 。
无向树的边由 edges 给出,其中 edges[i] = [fromi, toi] ,表示有一条边连接 from 和 toi 。除此以外,还有一个布尔数组 hasApple ,其中 hasApple[i] = true 代表节点 i 有一个苹果,否则,节点 i 没有苹果。

Example

示例 1:



输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,true,false,false,true,false]
输出:6
解释:上图展示了给定的树,其中红色节点表示有苹果。一个能收集到所有苹果的最优方案由绿色箭头表示。

示例 2:
输入:n = 7, edges = [[0,1],[0,2],[1,4],[1,5],[2,3],[2,6]], hasApple = [false,false,false,false,false,false,false]
输出:0

题目链接:1443. 收集树上所有苹果的最少时间 (难度:中等)

思路

从题目的描述中可以看出,这其实是一个无向图上的搜索问题。显然从示范用例当中可以看出两个特例:

  • 如果苹果的个数为 0,则收集次数为 0 次
  • 如果苹果个数为 n,则显然收集次数应当为 2 * (n - 1)
    因此,我们需要先对无向树建立邻接表,并统计苹果的个数。当苹果个数 x 满足 0 < x < n 时,我们采用深度优先搜索的方式,搜索策略如下:

设 dfs(root, graph, hasApple, visited) 为收集根为 root 的树上的苹果所需要的最少次数

  • 若 root 为叶节点,则判断 root 上是否有苹果。若有,则返回 2,若没有,则返回 0;【从父节点出发去子节点摘苹果并返回,同一条边需要走两次】
  • 若 root 非叶节点,则访问所有与 root 相邻的节点,并统计它们的最少收集次数 ans。若 ans = 0,则看 root 节点上是否有苹果,有的话返回 2, 没有返回 0;

代码

class Solution {
public:
    int dfs(int root, vector<vector<int>>& graph, vector<bool>& hasApple,vector<bool>& visited){
        int ans = 0;
        visited[root] = true;
        for(int i = 0;i < graph[root].size();++i){
            if(visited[graph[root][i]])  continue;
            ans += dfs(graph[root][i], graph, hasApple,visited);
        }
        if(ans == 0){
            return hasApple[root] ? 2 : 0;
        }
        return ans + 2;
    }
    int minTime(int n, vector<vector<int>>& edges, vector<bool>& hasApple) {
        vector<vector<int>> graph(n,vector<int>{});
        vector<bool> visited(n, false);
        int cnt = 0;
        for(int i = 0;i < n - 1;++i){
            cnt += hasApple[i];
            graph[edges[i][0]].push_back(edges[i][1]);
            graph[edges[i][1]].push_back(edges[i][0]);
        }
        cnt += hasApple.back();
        if(cnt == 0){
            return 0;
        }else if(cnt == n){
            return (n - 1) * 2;
        }
        return dfs(0, graph, hasApple,visited) - 2;
    }
};

执行结果: 404 ms, 60.5 MB

相关文章

  • Leetcode 1443. 收集树上所有苹果的最少时间(无向树

    问题描述 给你一棵有 n 个节点的无向树,节点编号为 0 到 n-1 ,它们中有一些节点有苹果。通过树上的一条边,...

  • DirectedAcyclicGraph

    有向无环图,所有的树都是有向无环图

  • 离散数学大概(四)

    树连通无回路的无向图称为无向树,或树。每个连通分支都是树的无向图称为森林。平凡图称为平凡树。在无向树中,悬挂顶点(...

  • 苹果传记(25)

    苹果本身是一团气,以最快的速度向桃树冲过去,不放过每一棵树,把对所有的愤怒都发泄到这这桃树上,对桃子是恨之入骨! ...

  • 旅行到时间深处

    小时候 时间躲藏在树上的青苹果里 苹果红了 我们长大了 长大后 时间徘徊在深夜无眠的月光里 黎明出来 我们就老了 ...

  • 人间大五谷记

    1、木谷 ——木谷长在树上。 苹果树 所有幸存于枝条上的花朵 子房膨胀,花柄弯曲 坐果 都有向死而生的决绝。花瓣 ...

  • 冬日果园里那抹绿色

    今天立冬,站在初中部教学楼东边操场西北角向果园望去,虽然苹果、梨树、山楂树、桃树等果木树上的叶子稀稀疏疏,...

  • (状压dp)1986. 完成任务的最少工作时间段

    1986. 完成任务的最少工作时间段[https://leetcode-cn.com/problems/minim...

  • 一起学算法-1827. 最少操作使数组递增

    一、题目1827. 最少操作使数组递增 LeetCode地址:https://leetcode-cn.com/pr...

  • 苹果树

    我最喜欢的树是苹果树。 春天,苹果树上长满了绿色的新芽, 后来,慢慢的长出了美丽的花朵。 ...

网友评论

      本文标题:Leetcode 1443. 收集树上所有苹果的最少时间(无向树

      本文链接:https://www.haomeiwen.com/subject/mqudfktx.html