这道题看上去很复杂,其实只要读懂了题,明白了到底要干什么,这个题还是比较简单的

首先通过题目我们知道了给的是一棵 n 个节点的树(一个无向、连通、无环图),那也就说明两个结点之间的路径只有一条(因为无环)。这里要求到首都(0结点)的最少油耗,对于一个结点来说,走向0结点只有一条路径,路径长度是唯一的,如果不与别人拼车,那么油耗也是固定的。

因此要想找到最少油耗,就要尽可能让多的人坐同一辆车(每辆车尽量坐满)。这样就变成了要使一个一个结点,在某一刻在这个结点的人要尽可能的多,然后大家一起分配车坐车(尽可能最大利用每辆车)(因为车是无限的,因此可以每到一个结点换一辆车),向下一个结点进发,然后与下一个结点的人会和,继续向下一个结点,值到首都0结点

我们可以发现,对于一个结点其最大的人数为本身个数1加上子节点的个数(不能加上父节点,加上父节点会造成有人走来回,不是最小油耗)

详细代码

class Solution {public:// 用来保存路径,加速查找,防止TLEunordered_map<int, vector<int>> dir;// 油耗long long res;// 从字节点来的人数long long func(vector<vector<int>>& roads, int seats, int fro, int pos){// 当前结点人数long long size = 1;for(int i = 0; i < dir[pos].size(); i++){int des = dir[pos][i];// 不统计从父节点来的人if(des == fro)     continue;// 从子节点来的人long long temp = func(roads, seats, pos, des);// 子节点来人在路上(两个结点之间)产生的油耗,res += temp / seats;if(temp % seats != 0)    // 向上取整,此时有车未坐满res++;size += temp;}// 向下一个父节点去的人数return size;}long long minimumFuelCost(vector<vector<int>>& roads, int seats) {res = 0;for(int i = 0; i < roads.size(); i++){dir[roads[i][0]].push_back(roads[i][1]);dir[roads[i][1]].push_back(roads[i][0]);}func(roads, seats, -1, 0);return res;}
};

LeetCode 2477. 到达首都的最少油耗相关推荐

  1. LC 6243 到达首都的最少油耗(贪心)

    LC 6243 到达首都的最少油耗(贪心) 需要考虑每条边的贡献,下界是 ⌈ s z s e a t ⌉ \lceil\dfrac{sz}{seat}\rceil ⌈seatsz​⌉, s z sz ...

  2. 6243. 到达首都的最少油耗

    class Solution { public:int f[100005];//f[i]表示i节点有几个子节点int vis[100005];long long value[100005];void ...

  3. LeetCode 1976. 到达目的地的方案数(迪杰斯特拉 Python 优先队列)

    文章目录 1. 题目 2. 解题 1. 题目 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 ,某些路口之间有 双向 道路. 输入保证你可以从任意路口出发到达其他任意路口,且任 ...

  4. LeetCode 1210. 穿过迷宫的最少移动次数(状态压缩BFS)

    文章目录 1. 题目 2. 解题 1. 题目 你还记得那条风靡全球的贪吃蛇吗? 我们在一个 n*n 的网格上构建了新的迷宫地图,蛇的长度为 2,也就是说它会占去两个单元格. 蛇会从左上角((0, 0) ...

  5. LeetCode 815. 公交路线(最少换乘,BFS)

    1. 题目 我们有一系列公交路线.每一条路线 routes[i] 上都有一辆公交车在上面循环行驶. 例如,有一条路线 routes[0] = [1, 5, 7],表示第一辆 (下标为0) 公交车会一直 ...

  6. LeetCode 6033. 转换数字的最少位翻转次数(位运算)

    文章目录 1. 题目 2. 解题 1. 题目 一次 位翻转 定义为将数字 x 二进制中的一个位进行 翻转 操作,即将 0 变成 1 ,或者将 1 变成 0 . 比方说,x = 7 ,二进制表示为 11 ...

  7. LeetCode 2187. 完成旅途的最少时间(二分查找)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个数组 time ,其中 time[i] 表示第 i 辆公交车完成 一趟旅途 所需要花费的时间. 每辆公交车可以 连续 完成多趟旅途,也就是说,一辆 ...

  8. LeetCode 2162. 设置时间的最少代价(枚举)

    文章目录 1. 题目 2. 解题 1. 题目 常见的微波炉可以设置加热时间,且加热时间满足以下条件: 至少为 1 秒钟. 至多为 99 分 99 秒. 你可以 最多 输入 4 个数字 来设置加热时间. ...

  9. LeetCode 2139. 得到目标值的最少行动次数(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 你正在玩一个整数游戏.从整数 1 开始,期望得到整数 target . 在一次行动中,你可以做下述两种操作之一: 递增,将当前整数的值加 1(即, x = ...

最新文章

  1. 使用request实现网站中的注册功能
  2. 图片滤镜算法原理简单讲解
  3. Android核心分析之二十三Andoird GDI之基本原理及其总体框架
  4. SpecFlow特性介绍1-Step Definitions
  5. 删除千万级表中重复记录的办法
  6. java面试题4(基础)
  7. 下拉加载 实现 java_[Java教程]iscroll5实现一个下拉刷新上拉加载的效果
  8. 目前计算机病毒只有网络型病毒吗,在web.xml中使用()标签配置过滤器
  9. Java 代码精简之道 | 长文
  10. 《PHP综合开发环境》(NuSphere PhpED v5.6.5615 Win32)[压缩包]
  11. wxWidgets第三课 MSWWindowProc处理窗口消息
  12. 云应用性能管理哪家强?性能魔方mmTrix自动测评、检测与加速
  13. Recompile/upgrade nginx binary with no down-time
  14. 百度图神经网络学习——day02:图游走类模型
  15. .Net向Page和UpdatePanel输出JS
  16. Memory for crash kernel (0x0 to 0x0) notwithin permissible range
  17. C语言----打家劫舍(leetcode三题汇总)
  18. 2018厦门大学计算机技术分数线,厦门大学录取分数线2018 厦门大学录取分数最高的专业...
  19. length与length()的区别
  20. python——xlsx文件的读写操作详解

热门文章

  1. 汾阳哪里有计算机培训班,汾阳计算机培训班,汾阳计算机培训价格,汾阳计算机培训学费一览表 - IT教育频道...
  2. 为什么需要全屋净水,喝的水干净不就可以了?
  3. Note3 港版稳定ROM 刷机
  4. cgb2106-day02
  5. 好客租房移动web项目(3)
  6. Android通过网络URL获取图片并显示
  7. svc2kxp.cmd——XP系统的优化利器
  8. 魔力更新不能在服务器寻找文件,魔力Ⅱ日服更新发生不明原因问题
  9. 如何重定向到另一个网页? [英]How do I redirect to another webpage?
  10. centos7安装MongoDB4.2社区版(单节点)