教3妹学编程-算法题】到达首都的最少油耗
  96AOqGW9dKgh 2023年12月05日 26 0

教3妹学编程-算法题】到达首都的最少油耗_结点

3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”
2哥 :3妹,什么事呀这么开发。
3妹:2哥你看今天的天气多好啊,阳光明媚、万里无云、秋高气爽,适合秋游。
2哥:是啊,立冬之后天气多以多云为主,好不容易艳阳高照。可是你不能秋游,赶紧收拾收拾上班去啦
3妹:哼, 好吧~
2哥:给你出了一道题发你微信里了, 上班通勤的路上记得看一下,回来问你答案~

教3妹学编程-算法题】到达首都的最少油耗_深度优先搜索_02


3妹:知道啦,难不倒我!


 1题目: 

给你一棵 n 个节点的树(一个无向、连通、无环图),每个节点表示一个城市,编号从 0 到 n - 1 ,且恰好有 n - 1 条路。0 是首都。给你一个二维整数数组 roads ,其中 roads[i] = [ai, bi] ,表示城市 ai 和 bi 之间有一条 双向路 。

每个城市里有一个代表,他们都要去首都参加一个会议。

每座城市里有一辆车。给你一个整数 seats 表示每辆车里面座位的数目。

城市里的代表可以选择乘坐所在城市的车,或者乘坐其他城市的车。相邻城市之间一辆车的油耗是一升汽油。

请你返回到达首都最少需要多少升汽油。

示例 1:


教3妹学编程-算法题】到达首都的最少油耗_深度优先搜索_03

输入:roads = [[0,1],[0,2],[0,3]], seats = 5
输出:3
解释:

  • 代表 1 直接到达首都,消耗 1 升汽油。
  • 代表 2 直接到达首都,消耗 1 升汽油。
  • 代表 3 直接到达首都,消耗 1 升汽油。
    最少消耗 3 升汽油。

示例 2:


教3妹学编程-算法题】到达首都的最少油耗_List_04


输入:roads = [[3,1],[3,2],[1,0],[0,4],[0,5],[4,6]], seats = 2
输出:7
解释:

  • 代表 2 到达城市 3 ,消耗 1 升汽油。
  • 代表 2 和代表 3 一起到达城市 1 ,消耗 1 升汽油。
  • 代表 2 和代表 3 一起到达首都,消耗 1 升汽油。
  • 代表 1 直接到达首都,消耗 1 升汽油。
  • 代表 5 直接到达首都,消耗 1 升汽油。
  • 代表 6 到达城市 4 ,消耗 1 升汽油。
  • 代表 4 和代表 6 一起到达首都,消耗 1 升汽油。
    最少消耗 7 升汽油。

示例 3:


教3妹学编程-算法题】到达首都的最少油耗_结点_05


输入:roads = [], seats = 1
输出:0
解释:没有代表需要从别的城市到达首都。

提示:

1 <= n <= 10^5
roads.length == n - 1
roads[i].length == 2
0 <= ai, bi < n
ai != bi
roads 表示一棵合法的树。
1 <= seats <= 10^5

 2思路: 

教3妹学编程-算法题】到达首都的最少油耗_深度优先搜索_06

贪心 + 深度优先搜索,
题目等价于给出了一棵以节点 0 为根结点的树,并且初始树上的每一个节点上都有一个人,现在所有人都需要通过「车子」向结点 0 移动。

对于某一个节点 x,x≠0,其父节点为 y。因为以节点 x 为根结点的子树上的人都需要通过边 x→y向节点 0 移动,所以为了使这条边上的「车子」利用率最高,我们贪心的让 x 的全部子节点上的人到了节点 x 后再一起坐车向上移动,我们不妨设以节点 x 为根节点的子树大小为 cntx,那么我们至少需要「车子」的数量为 ⌈cntx/seats⌉,其中 seats 为一辆车的给定座位数。

那么我们可以通过从根结点 0 往下进行「深度优先搜索」,每一条边上「车子」的数目即为该条边上汽油的开销,统计全部边上汽油的开销即为最终答案。

 3java代码: 

class Solution {
    long ans = 0;
    public long minimumFuelCost(int[][] roads, int seats) {
        int n = roads.length + 1;
        List<List<Integer>> map = new ArrayList<>();
        for (int i = 0; i < n; i++) {
            map.add(new ArrayList<>());
        }
        for (int i = 0; i < roads.length; i++) {
            map.get(roads[i][0]).add(roads[i][1]);
            map.get(roads[i][1]).add(roads[i][0]);
        }
        dfs(map,0,-1,seats);
        return ans;
    }


    public int dfs(List<List<Integer>> map,int cur,int father,int seats){
        int size = 1;
        for (int node : map.get(cur)){
            if (node != father){
                size += dfs(map,node,cur,seats);
            }
        }
        if (cur != 0) ans+=(int)Math.ceil((double) size/seats);
        return size;
    }
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
  DEdnwYVS9Z9b   2023年12月12日   20   0   0 ListredisredisList
96AOqGW9dKgh