LeetCode:2477. 到达首都的最少油耗(DFS C++、Java)

目录

2477. 到达首都的最少油耗

题目描述:

实现代码与解析:

dfs


2477. 到达首都的最少油耗

题目描述:

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

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

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

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

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

示例 1:

输入:roads = [[0,1],[0,2],[0,3]], seats = 5
输出:3
解释:
- 代表 1 直接到达首都,消耗 1 升汽油。
- 代表 2 直接到达首都,消耗 1 升汽油。
- 代表 3 直接到达首都,消耗 1 升汽油。
最少消耗 3 升汽油。

示例 2:

输入: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:

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

提示:

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

实现代码与解析:

dfs

C++

class Solution {
public:vector<int> e = vector<int>(200010, 0), ne = vector<int>(200010, 0), h = vector<int>(100010, -1);vector<bool> q = vector<bool>(100010, false);int idx = 0;long long res = 0;void add (int a, int b) {e[idx] = b, ne[idx] = h[a], h[a] = idx++;}int dfs (int cur, int seats) {int sum = 1;q[cur] = true; // 标记,避免反向遍历回去for (int i = h[cur]; ~i; i = ne[i]) {int j = e[i];if (!q[j])  sum += dfs(j, seats);     }if (cur != 0) res += (sum + seats - 1) / seats; return sum;}long long minimumFuelCost(vector<vector<int>>& roads, int seats) {for (int i = 0; i < roads.size(); i++) {int a = roads[i][0];int b = roads[i][1];add(a, b);add(b, a);}dfs(0, seats);return res;}
};

Java

class Solution {public int idx = 0;public int N = 100010;public int[] h = new int[N], e = new int[N*2], ne = new int[N*2];public boolean[] q = new boolean[N];public long res = 0;public void add(int a, int b)  {e[idx] = b; ne[idx] = h[a]; h[a] = idx++;}public int dfs(int cur, int seats) {int sum = 1;q[cur] = true;for (int i = h[cur]; i != -1; i = ne[i]) {int j = e[i];if (!q[j]) sum += dfs(j, seats);}if (cur != 0) res += (sum + seats - 1) / seats;return sum;}public long minimumFuelCost(int[][] roads, int seats) {Arrays.fill(h, -1);for (int i = 0; i < roads.length; i++) {int a = roads[i][0];int b = roads[i][1];add(a, b);add(b, a);}dfs(0, seats);return res;}
}

原理思路:

        深度优先遍历,从首都开始遍历,从叶子节点向首都返回人数,后序每经过一个节点,就加上此节点的人,同时计算一下需要的车辆,也就是下一路程需要的油,最后到首都后就不在计算,因为已经到终点了。

        res += (sum + seats - 1) / seats;  是用来向上取整的。

还有记得记录以及走过的节点,避免往回走,无限递归。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198540.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

医院预约挂号平台的设计与实现

摘 要 网络的空前发展给人们的工作和生活带来了极大的便利&#xff0c;信息技术已成为节约运营成本、提高工作效率的首选。相比之下&#xff0c;国内相当多的中小医院在医院预约工作中的手工工作比较保守&#xff0c;数据查询和存储成本都很高&#xff0c;但效率很低。为了使医…

JAVAEE初阶 多线程基础(六)

wait,notify,饿汉模式 一.wait,notify方法使用1.1 例子 二.wait和sleep区别三.单例模式中的饿汉模式 一.wait,notify方法使用 引入wait和notify为了能够从应用层面上,干预到多个不同线程代码的执行顺序,不是影响系统的线程调度策略. 相当于是在应用程序代码中,让后执行的线程,主…

支付宝沙箱支付

1. 二维码 1.1 什么是二维码&#xff1a; ​ 二维码又称QR Code&#xff0c;QR全称Quick Response&#xff0c;是一个近几年来移动设备上超流行的一种编码方式&#xff0c;它比传统的Bar Code条形码能存更多的信息&#xff0c;也能表示更多的数据类型。 ​ 二维条码/二维码&…

leetcode LCR 083. 全排列

Problem: LCR 083. 全排列 思路 使用一个visited数组来记录每一轮递归中数字被使用情况&#xff0c;dfs Code /*** param {number[]} nums* return {number[][]}*/ var permute function(nums) {const len nums.lengthconst cur [] // 当前轮次的排列结果const res [] /…

【2023.12.4练习】数据库知识点复习测试

概论 数据表&#xff1a;用于存储现实中数据的联系。 储存信息联系。 字段&#xff1a;又称列&#xff0c;如姓名、年龄、编号等。 记录&#xff1a;又称元组&#xff0c;为数据表中的一行&#xff0c;代表了一个实体的信息。 数据库&#xff08;DB&#xff09;&#xff1…

HNU-电路与电子学-2017期末B卷(不含解析)

【写在前面】 电路与电子学好像是从2020级开设的课程&#xff0c;故实际上目前只有2020与2021两个年级考过期末考试。 这门课程主要由所谓的“数电”与“模电”组成。而且先学的“模电”后学的“”数电&#xff0c;故期中考试主要以“模电”为主&#xff0c;期末考试主要以“…

C语言变长参数及其陷阱

C语言变长参数及其陷阱 C 工具 变长参数列表 这部分解释了旧的 C 风格变长参数列表。了解这些内容很重要&#xff0c;因为你可能会在遗留代码中遇到它们。然而&#xff0c;在新代码中&#xff0c;你应该使用变参模板来实现类型安全的变长参数列表。 考虑 C 函数 printf()&a…

04数据平台Flume

Flume 功能 Flume主要作用&#xff0c;就是实时读取服务器本地磁盘数据&#xff0c;将数据写入到 HDFS。 Flume是 Cloudera提供的高可用&#xff0c;高可靠性&#xff0c;分布式的海量日志采集、聚合和传输的系统工具。 Flume 架构 Flume组成架构如下图所示&#xff1a; A…

watch的 防抖 防止多次调用请求

watch监听数据变化时&#xff0c;如果数据变化频繁&#xff0c;就会导致watch函数被多次调用&#xff0c;从而发生多次请求的情况。解决这个问题的方法是使用防抖或节流函数来限制函数的调用频率。下面是一个使用lodash库中的防抖函数解决watch多次请求问题的例子&#xff1a; …

常见数据文件存储和读取

当我们使用 Python 读取数据文件时&#xff0c;首先推荐的就是通过 Pandas 完成&#xff0c;Pandas 几乎支持所有常见的数据文件格式。 数据类型文件格式读取方式存储方式文本CSVread_csvto_csv文本JSONread_jsonto_json文本HTMLread_htmlto_html文本剪切板read_clipboardto_c…

ios上传图片旋转问题解决方案(vant上传图片)

使用 van-uploader(vant 组件库上传图片组件)上传图片时&#xff0c; 部分 ios 机型&#xff0c;会偶发从手机上传图片后&#xff0c;图片预览中&#xff0c;图片旋转了 90 度的问题。 对于该问题&#xff0c;vant 官网中也给出了解决方案。 但官网中的方案适配的是单选情况下…

编译原理:NFA转DFA(原理+完整代码+可视化实现)

NFA转换为DFA 【本文内容摘要】 什么是DFA通过子集构造法将NFA转换为DFA生成DFA的dot文件并且形成可视化。 如果本文对各位看官有用的话&#xff0c;请记得给一个免费的赞哦&#xff08;收藏也不错&#xff09;&#xff01; 文章目录 NFA转换为DFA一、什么是DFA二、NFA转换为…

【GO】protobuf在golang中的测试用例

上篇文章介绍了如何安装protobuf环境&#xff0c;文章链接如下 【Go】protobuf介绍及安装-CSDN博客 本节介绍protobuf在gRPC中具体如何使用&#xff0c;并编写测试用例 一、Protobuf是如何工作的 .proto文件是protobuf一个重要的文件&#xff0c;它定义了需要序列化数据的结…

企业微信配置可信域名

首先去申请一个域名&#xff0c;然后将域名绑定到有公网ip的云服务器上&#xff0c;绑定到具体的网站&#xff1b;然后再企业微信&#xff0c;管理后台&#xff0c;点击具体的应用&#xff0c;进【网页授权及JS-SDK】&#xff1b;点击底部的【申请校验域名】点击下载文件&#…

postgresql pg_hba.conf 配置详解

配置文件之pg_hba.conf介绍 该文件用于控制访问安全性&#xff0c;管理客户端对于PostgreSQL服务器的访问权限&#xff0c;内容包括&#xff1a;允许哪些用户连接到哪个数据库&#xff0c;允许哪些IP或者哪个网段的IP连接到本服务器&#xff0c;以及指定连接时使用的身份验证模…

第73讲:深入理解MySQL数据库InnoDB存储引擎:内存结构、磁盘结构与后台线程全面解析

文章目录 1.InnoDB存储引擎的架构2.InnoDB存储引擎的内存结构2.1.Buffer Pool缓冲池2.2.Change Buffer更改缓冲区2.3.自适应Hash索引2.4.Log Buffer日志缓冲区 3.InnoDB存储引擎的磁盘结构3.1.System Tablespace系统表空间3.2.File-Per-Table Tablespaces每个表都有单独的表空间…

ES6箭头函数和js普通函数的区别整理

普通函数的this指向为&#xff1a;谁调用它this就指向谁&#xff0c;this被不同对象调用是会变的 箭头函数的this指向为&#xff1a;声明该箭头函数时&#xff0c;外层第一个普通函数的this指向谁就固定为谁&#xff0c;不会改变 function foo() {console.log(this)}const ob…

红警For Mac(RAM芯片可玩)

1、文件损坏解决版本&#xff01; 执行以下命令&#xff0c;&#xff08;注意&#xff1a;命令2应用路径根据实际情况修改&#xff09; sudo spctl --master-disable sudo xattr -r -d com.apple.quarantine /Applications/红警2尤里复仇M芯片.app2、新系统14&#xff0c;第一…

Oracle Flashback示例集锦

Flashback Table 本例参考Rewind a Table Using Oracle Flashback Table Flashback Table&#xff0c;Flashback Query和Flashback Drop的示例合集可参见这里 首先获得当前的时间&#xff0c;或当前的SCN&#xff0c;以便后续回退使用 -- 获取SCN法1 select DBMS_FLASHBACK.…

孩子都能学会的FPGA:第二十一课——用线性反馈移位寄存器实现伪随机序列

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…