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], ...
随机推荐
- vue几种插槽的使用方法
参考文档:https://blog.csdn.net/weixin_49217200/article/details/118496525 参考文档:https://blog.csdn.net/ct52 ...
- bootstrapv4轮播图去除两侧阴影及线框
一.前提条件: 在使用bootstrap v4中的轮播图组件时,两侧默认出现阴影,且轮播组件示例不一致! 二.bootstrap文档组件展示与实际应用 1.官方文档展示如下:没有阴影 2.实际应用情 ...
- 2022中职组网络空间安全 A模块
A-1任务一 登录安全加固 1.密码策略(Windows,Linux) 主要是针对windows和Linux的系统加固,类似于运维的题目 a.设置最短密码长度为15: 这里并没有说明具体是Window ...
- 量子图形加密算法的MATLAB代码实现
一.概述 目前主流的量子图形加密算法有量子像素编码算法(Quantum Image Pixel Encoding,QIPE).量子像素置乱算法(Quantum Image Pixel Scrambli ...
- Android笔记--通过MediaStore查询图片
相关描述 已经完成发送彩信功能之后,就来继续向前走一步,来到MediaStore查询图片界面啦! 具体步骤实现 1.简简单单地一个界面 <?xml version="1.0" ...
- Python学习笔记--从继承开始继续
继承的基础语法 单继承: 多继承:一个子类继承多个父类 pass关键字补全语法 注意事项: 复写和使用父类成员 复写父类成员 也就是相当于Java中的方法重写 调用父类成员 变量的类型注解 举例: 更 ...
- Spring--案例:百度网盘密码数据兼容处理
案例再度来袭 也就是说,在百度网盘的密码复制时,后面即使有空格也能提取成功(trim方法) 案例的实现: 也就是实现存在空格时,也能输出true: 现在的话: 那么,我们应该如何使得它忽略空格呢? 这 ...
- Javaweb实践复习--MyBatis
增删改查操作 查询 查询所有数据 1.编写接口方法:Mapper接口------参数:无------结果:List 2.编写sql语句:SQL映射文件 一般情况下,若是用户实体类里面的变量名称与数据库 ...
- 如何基于 Agora Android SDK 在应用中实现视频通话?
在很多产品,实时视频通话已经不是新鲜的功能了,例如视频会议.社交应用.在线教育,甚至也可能出现在一些元宇宙的场景中. 本文将教你如何通过声网Agora 视频 SDK 在 Android 端实现一个视频 ...
- 详解 printf() 函数
声明(叠甲):鄙人水平有限,本文章仅供参考. 1. 引子 #include <stdio.h> int main() { printf("hello world\n") ...