2022-11-28:给定两个数组A和B,比如 A = { 0, 1, 1 } B = { 1, 2, 3 } A[0] = 0, B[0] = 1,表示0到1有双向道路 A[1] = 1, B[1]
2022-11-28:给定两个数组A和B,比如
A = { 0, 1, 1 }
B = { 1, 2, 3 }
A[0] = 0, B[0] = 1,表示0到1有双向道路
A[1] = 1, B[1] = 2,表示1到2有双向道路
A[2] = 1, B[2] = 3,表示1到3有双向道路
给定数字N,编号从0~N,所以一共N+1个节点
题目输入一定保证所有节点都联通,并且一定没有环
默认办公室是0节点,其他1~N节点上,每个节点上都有一个居民
每天所有居民都去往0节点上班
所有的居民都有一辆5座的车,也都乐意和别人一起坐车
车不管负重是多少,只要走过一条路,就耗费1的汽油
比如A、B、C的居民,开着自己的车来到D居民的位置,一共耗费3的汽油
D居民和E居民之间,假设有一条路
那么D居民可以接上A、B、C,4个人可以用一辆车,去往E的话,就再耗费1的汽油。
求所有居民去办公室的路上,最少耗费多少汽油。
来自微软。
答案2022-11-28:
dfn序。
代码用rust编写。代码如下:
use std::iter::repeat;
fn main() {
let mut a1 = vec![0, 1, 1];
let mut b1 = vec![1, 2, 3];
let n1 = 3;
println!("ans = {}", min_fuel(&mut a1, &mut b1, n1));
let mut a2 = vec![1, 1, 1, 9, 9, 9, 9, 7, 8];
let mut b2 = vec![2, 0, 3, 1, 6, 5, 4, 0, 0];
let n2 = 9;
println!("ans = {}", min_fuel(&mut a2, &mut b2, n2));
}
static mut CNT: i32 = 0;
fn min_fuel(a: &mut Vec<i32>, b: &mut Vec<i32>, n: i32) -> i32 {
// 先建图
let mut graph: Vec<Vec<i32>> = vec![];
for _i in 0..=n {
graph.push(vec![]);
}
for i in 0..a.len() {
graph[a[i] as usize].push(b[i]);
graph[b[i] as usize].push(a[i]);
}
// 建图完毕
// 根据题目描述,办公室一定是0号点
// 所有员工一定是往0号点汇聚
// a 号,dfn[a] == 0 没遍历过!
// dfn[a] != 0 遍历过!
let mut dfn: Vec<i32> = repeat(0).take((n + 1) as usize).collect();
// a为头的树,一共有10个节点
// size[a] = 0
// size[a] = 10
let mut size: Vec<i32> = repeat(0).take((n + 1) as usize).collect();
// 所有居民要汇总吗?
// a为头的树,所有的居民是要向a来汇聚
// cost[a] : 所有的居民要向a来汇聚,总油量的耗费
let mut cost: Vec<i32> = repeat(0).take((n + 1) as usize).collect();
unsafe { CNT = 0 };
dfs(&mut graph, 0, &mut dfn, &mut size, &mut cost);
return cost[0];
}
// 图 : graph
// 当前的头,原来的编号,不是dfn序号! : cur
// 从cur开始,请遍历
// 遍历完成后,请把dfn[cur]填好!size[cur]填好!cost[cur]填好
fn dfs(
graph: &mut Vec<Vec<i32>>,
cur: i32,
dfn: &mut Vec<i32>,
size: &mut Vec<i32>,
cost: &mut Vec<i32>,
) {
unsafe {
CNT += 1;
}
dfn[cur as usize] = unsafe { CNT };
size[cur as usize] = 1;
for next in graph[cur as usize].clone().iter() {
if dfn[*next as usize] == 0 {
dfs(graph, *next, dfn, size, cost);
size[cur as usize] += size[*next as usize];
cost[cur as usize] += cost[*next as usize];
cost[cur as usize] += (size[*next as usize] + 4) / 5;
}
}
}
执行结果如下:

2022-11-28:给定两个数组A和B,比如 A = { 0, 1, 1 } B = { 1, 2, 3 } A[0] = 0, B[0] = 1,表示0到1有双向道路 A[1] = 1, B[1]的更多相关文章
- 给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数。
题目:给定两个数组,这两个数组是排序好的,让你求这两个数组合到一起之后第K大的数. 解题思路: 首先取得数组a的中位数a[aMid],然后在b中二分查找a[aMid],得到b[bMid],b[bSt] ...
- js:给定两个数组,如何判断他们的相对应下标的元素类型是一样的
题目: 给Array对象原型上添加一个sameStructureAs方法,该方法接收一个任意类型的参数,要求返回当前数组与传入参数数组(假定是)相对应下标的元素类型是否一致. 假设已经写好了Array ...
- 前端与算法 leetcode 350. 两个数组的交集 II
目录 # 前端与算法 leetcode 350. 两个数组的交集 II 题目描述 概要 提示 解析 解法一:哈希表 解法二:双指针 解法三:暴力法 算法 # 前端与算法 leetcode 350. 两 ...
- 350. 两个数组的交集 II
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...
- LeetCode349. 两个数组的交集
题目 给定两个数组,编写一个函数来计算它们的交集. 分析 数组元素值可以很大,所以不适合直接开数组进行哈希,这里要学习另一种哈希方式:集合 集合有三种,区别见下面代码随想录的Carl大佬的表格,总结的 ...
- [C++]for同时遍历两个数组
C++11同时遍历两个数组 #define for2array(x,y,xArray,yArray) \ for(auto x=std::begin(xArray), x##_end=std::end ...
- [Swift]LeetCode349. 两个数组的交集 | Intersection of Two Arrays
Given two arrays, write a function to compute their intersection. Example 1: Input: nums1 = [1,2,2,1 ...
- 6、两个数组的交集 II
6.两个数组的交集 II 给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: n ...
- Leetcode 350.两个数组的交集|| By Python
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2,2] 示例 2: 输入: nums1 = [4,9,5 ...
- Leetcode 349. 两个数组的交集 By Python
给定两个数组,编写一个函数来计算它们的交集. 示例 1: 输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2: 输入: nums1 = [4,9,5], ...
随机推荐
- [imx6ull] 源码下载
uboot git clone https://source.codeaurora.org/external/imx/uboot-imx cd uboot-imx make distclean mak ...
- JDK 7 HashMap 并发情况下的死锁问题
目录 问题描述 详细解释 问题描述 JDK7的 HashMap 解决冲突用的是链表,在插入链表的时候用的是头插法,每次在链表的头部插入新元素.resize() 的时候用的依然是头插,头插的话,如果某个 ...
- 密码破解-hashcat的简单使用
在我们抓取到系统的hash值之后,需要通过一些工具来破解密码 hashcat是一款可以基于显卡暴力破解密码的工具,几乎支持了所有常见的加密,并且支持各种姿势的密码搭配 在kali Linux中自带的有 ...
- Less-5 和 Less-6 SQL盲注
判断注入点 测试:http://localhost/sqli-labs-master/Less-5/?id=1a和http://localhost/sqli-labs-master/Less-5/?i ...
- gerrit部署使用
前言 gerrit是基于git的工具,code review功能是开发中很方便,此外它可以配合Jenkins进行自动化的编译工作.今天给大家分享一下gerrit在ubuntu的安装使用 作者:良知犹存 ...
- 【CS231n assignment 2022】Assignment2 - Part 1,全连接网络的初始化以及正反向传播
文章目录 前言 FullyConnectedNets 网络初始化 代码注意事项 1. W 的尺寸怎么知道? 2. np.random.norml() 3. batchnorm loss(self, X ...
- Windows 11 正式版(2021/10/19更新)
Windows 11 (business editions), version 21H2 (updated October 2021) (x64) - DVD (Chinese-Simplified) ...
- 最大流应用(Maximum Flow Application)
1. 二分图匹配(Bipartite Matching) 1.1 匹配(Matching) Def. Given an undirected graph \(G = (V, E)\), subset ...
- Spark基础实验七
今天在做实验七,最开始有许许多多多的错误,最后通过查找.问同学才知道是数据集的格式和存放位置的原因. 就在好不容易解决了上一个错误,下一个错误就立马而来,错误如下: 目前还未找到解决办法,spark实 ...
- EasyRelation发布,简单强大的数据关联框架
当开发人员需要进行关联查询时,往往需要编写大量的冗余代码来处理数据之间的关系.这不仅浪费时间和精力,还会影响项目的可维护性和可扩展性. EasyRelation 是一个简单.高效的自动关联数据框架,可 ...