力扣刷题之2959.关闭分部的可行集合数目

题干描述

一个公司在全国有 n 个分部,它们之间有的有道路连接。一开始,所有分部通过这些道路两两之间互相可以到达。

公司意识到在分部之间旅行花费了太多时间,所以它们决定关闭一些分部(也可能不关闭任何分部),同时保证剩下的分部之间两两互相可以到达且最远距离不超过 maxDistance 。

两个分部之间的 距离 是通过道路长度之和的 最小值 。

给你整数 n ,maxDistance 和下标从 0 开始的二维整数数组 roads ,其中 roads[i] = [ui, vi, wi] 表示一条从 ui 到 vi 长度为 wi的 无向 道路。

请你返回关闭分部的可行方案数目,满足每个方案里剩余分部之间的最远距离不超过 maxDistance

注意,关闭一个分部后,与之相连的所有道路不可通行。

注意,两个分部之间可能会有多条道路。

示例 1:

输入:n = 3, maxDistance = 5, roads = [[0,1,2],[1,2,10],[0,2,10]]
输出:5
解释:可行的关闭分部方案有:
- 关闭分部集合 [2] ,剩余分部为 [0,1] ,它们之间的距离为 2 。
- 关闭分部集合 [0,1] ,剩余分部为 [2] 。
- 关闭分部集合 [1,2] ,剩余分部为 [0] 。
- 关闭分部集合 [0,2] ,剩余分部为 [1] 。
- 关闭分部集合 [0,1,2] ,关闭后没有剩余分部。
总共有 5 种可行的关闭方案。

示例 2:

输入:n = 3, maxDistance = 5, roads = [[0,1,20],[0,1,10],[1,2,2],[0,2,2]]
输出:7
解释:可行的关闭分部方案有:
- 关闭分部集合 [] ,剩余分部为 [0,1,2] ,它们之间的最远距离为 4 。
- 关闭分部集合 [0] ,剩余分部为 [1,2] ,它们之间的距离为 2 。
- 关闭分部集合 [1] ,剩余分部为 [0,2] ,它们之间的距离为 2 。
- 关闭分部集合 [0,1] ,剩余分部为 [2] 。
- 关闭分部集合 [1,2] ,剩余分部为 [0] 。
- 关闭分部集合 [0,2] ,剩余分部为 [1] 。
- 关闭分部集合 [0,1,2] ,关闭后没有剩余分部。
总共有 7 种可行的关闭方案。

示例 3:

输入:n = 1, maxDistance = 10, roads = []
输出:2
解释:可行的关闭分部方案有:
- 关闭分部集合 [] ,剩余分部为 [0] 。
- 关闭分部集合 [0] ,关闭后没有剩余分部。
总共有 2 种可行的关闭方案。

题干分析

问题描述

  1. 给定一个由n个分部组成的图,每个分部之间有若干条道路。
  2. 我们需要计算可以关闭分部的方案数量,满足剩余分部之间的最远距离不超过maxDistance。

解题方法 

  1. 使用位掩码枚举所有可能的分部组合。
  2. 对每个组合,使用Floyd-Warshall算法计算所有节点对之间的最短路径。
  3. 验证每个组合是否满足条件:所有节点两两之间的最远距离不超过maxDistance。

代码设计 

1.初始化和输入解析

  • 动态分配opened数组,用于表示哪些分部是打开的。
  • 动态分配二维数组d,用于存储节点之间的最短距离。
int res = 0;int* opened = (int*)malloc(n * sizeof(int));//动态分配数组opened,用于表示那些分部是打开的int** d = (int**)malloc(n * sizeof(int*));//动态分配二维数组d,用于存储节点之间的最短距离for (int i = 0; i < n; i++){d[i] = (int*)malloc(n * sizeof(int));}

 2.枚举所有可能的子集组合

  • 使用掩码mask枚举所有可能的子集组合,每个掩码表示一种组合方式。
//枚举所有可能的子集组合,使用掩码表示for (int mask = 0; mask < (1 << n); mask++){//初始化opened数组,表示当前子集中那些节点是打开的for (int i = 0; i < n; i++){opened[i] = mask & (1 << i);}//初始化距离矩阵d,将所有的节点对之间的距离初始化为一个很大的值(表示无穷大)for (int i = 0; i < n; i++){for (int j = 0; j < n; j++) {d[i][j] = 1000000;}}

3.更新距离矩阵

  • 根据当前子集中打开的节点,更新距离矩阵d。
  • 仅当两个节点都在当前子集中时,才更新这两个节点之间的距离。
//根据当前子集中的打开节点更新距离矩阵dfor (int k = 0; k < roadsSize; k++){int i = roads[k][0], j = roads[k][1], r = roads[k][2];if (opened[i] && opened[j]) {d[i][j] = d[j][i] == (d[i][j] < r) ? d[i][j] : r;}}

4. Floyd-Warshall 算法

  • 使用Floyd-Warshall 算法计算当前子集中所有节点对之间的最短距离。
  • 如果两个节点之间存在间接路径,更新它们之间的最短路径。

 

//使用Floyd-Warshall 算法计算所有节点对之间的最短路径for (int k = 0; k < n; k++){if (opened[k]) {for (int i = 0; i < n; i++){if (opened[i]) {for (int j = 0; j < n; j++){if (opened[j]) {if (d[i][k] + d[k][j] < d[i][j]) {d[i][j] = d[i][k] + d[k][j];}}}}}}}}

5.验证子集

  • 检查当前子集中所有节点两两之间的最远距离是否不超过maxDistance。
  • 如果所有节点都满足条件,则将当前子集计入结果res。
//验证当前子集是否满足所有节点两两之间的最远距离不超过maxDistanceint good = 1;for (int i = 0; i < n; i++){if (opened[i]) {for (int j = i + 1; j < n; j++){if (opened[j] && d[i][j] > maxDistance) {good = 0;break;}}if (!good){break;}}res += good;}

6.释放动态内存

  • 释放之前动态分配的内存避免内存泄漏。

 

//释放动态分配的内存for (int i = 0; i < n; i++){free(d[i]);}free(d);free(opened);return res;

完整的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>int numberOfSets(int n, int maxDistance, int** roads, int roadsSize, int* roadsColSize) {int res = 0;int* opened = (int*)malloc(n * sizeof(int));//动态分配数组opened,用于表示那些分部是打开的int** d = (int**)malloc(n * sizeof(int*));//动态分配二维数组d,用于存储节点之间的最短距离for (int i = 0; i < n; i++){d[i] = (int*)malloc(n * sizeof(int));}//枚举所有可能的子集组合,使用掩码表示for (int mask = 0; mask < (1 << n); mask++){//初始化opened数组,表示当前子集中那些节点是打开的for (int i = 0; i < n; i++){opened[i] = mask & (1 << i);}//初始化距离矩阵d,将所有的节点对之间的距离初始化为一个很大的值(表示无穷大)for (int i = 0; i < n; i++){for (int j = 0; j < n; j++) {d[i][j] = 1000000;}}//根据当前子集中的打开节点更新距离矩阵dfor (int k = 0; k < roadsSize; k++){int i = roads[k][0], j = roads[k][1], r = roads[k][2];if (opened[i] && opened[j]) {d[i][j] = d[j][i] == (d[i][j] < r) ? d[i][j] : r;}}//使用Floyd-Warshall 算法计算所有节点对之间的最短路径for (int k = 0; k < n; k++){if (opened[k]) {for (int i = 0; i < n; i++){if (opened[i]) {for (int j = 0; j < n; j++){if (opened[j]) {if (d[i][k] + d[k][j] < d[i][j]) {d[i][j] = d[i][k] + d[k][j];}}}}}}}}//验证当前子集是否满足所有节点两两之间的最远距离不超过maxDistanceint good = 1;for (int i = 0; i < n; i++){if (opened[i]) {for (int j = i + 1; j < n; j++){if (opened[j] && d[i][j] > maxDistance) {good = 0;break;}}if (!good){break;}}res += good;}//释放动态分配的内存for (int i = 0; i < n; i++){free(d[i]);}free(d);free(opened);return res;
}
int main() {int n = 3;int maxDistance = 5;int roadsSize = 3;int roadsColSize[] = { 3, 3, 3 };// 动态分配二维数组 roads,用于存储道路信息int** roads = (int**)malloc(roadsSize * sizeof(int*));for (int i = 0; i < roadsSize; i++) {roads[i] = (int*)malloc(3 * sizeof(int));}// 初始化道路信息roads[0][0] = 0; roads[0][1] = 1; roads[0][2] = 2;roads[1][0] = 1; roads[1][1] = 2; roads[1][2] = 10;roads[2][0] = 0; roads[2][1] = 2; roads[2][2] = 10;// 计算并输出结果int result = numberOfSets(n, maxDistance, roads, roadsSize, roadsColSize);printf("Total feasible solutions: %d\n", result);// 释放动态分配的内存for (int i = 0; i < roadsSize; i++) {free(roads[i]);}free(roads);return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

mysql group_concat()函数、行转列函数

文章目录 一、group_concat函数1.1、语法1.2、示例1.2.1、查询所有姓名&#xff0c;并显示在一行1.2.2、单列合并&#xff0c;指定冒号分隔符1.2.3、单列合并&#xff0c;去重1.2.4、多列拼接合并1.2.5、多列拼接合并&#xff0c;列和列之间指定分隔符 在mysql的关联查询或子查…

周报0708-0715(run代码)

本周围绕代码展开学习&#xff0c;学习了组内的FWI代码&#xff0c;主要收获是熟练了创建环境、匹配解释器、安装必要包的流程&#xff0c;以及搜索时的小Tips&#xff1a;比如需要的包whl&#xff08;表示该包的编译版本&#xff09;。遇到的问题仍然不少 三个主要问题&#…

「实战应用」如何用图表控件LightningChart JS创建树状图应用?

LightningChart JS是Web上性能特高的图表库&#xff0c;具有出色的执行性能 - 使用高数据速率同时监控数十个数据源。 GPU加速和WebGL渲染确保您的设备的图形处理器得到有效利用&#xff0c;从而实现高刷新率和流畅的动画&#xff0c;常用于贸易&#xff0c;工程&#xff0c;航…

Go语言并发编程-同步和锁

同步和锁 概述 同步是并发编程的基本要素之一&#xff0c;我们通过channel可以完成多个goroutine间数据和信号的同步。 除了channel外&#xff0c;我们还可以使用go的官方同步包sync&#xff0c;sync/atomic 完成一些基础的同步功能。主要包含同步数据、锁、原子操作等。 一…

P3-AI产品经理-九五小庞

AI产品的数据流向 美团外卖&#xff0c;实时只能调度 美团28分钟送达需求的分析 AI产品常用的算法 常用算法 常见的AI算法解析 自然语言生成NLG语音识别&#xff1a;科大讯飞&#xff0c;通义千问 虚拟现实机器学习平台 决策管理系统生物特征识别技术 RPA(机器人流程自动…

ICE-BA原理

文章目录 主要思想约束建立IMU&Local & globalBAIMU预积分LocalBAGlobalBA求解方法常用的求解思路改进增量BA方法 论文&#xff1a; 《ICE-BA: Incremental, Consistent and Efficient Bundle Adjustment for Visual-Inertial SLAM》 ICE-BA&#xff1a;增量、一致且高…

多商户SaaS版扫码点餐系统开源

基于前后端分离的 多商户 SaaS 版扫码点餐系统&#xff0c;支持后台点餐、多人同时在线点餐、购物车共享、餐桌状态实时监控&#xff0c;菜品管理、餐桌管理等众多功能。 源码下载&#xff1a;多商户 SaaS 版扫码点餐系统.zip 功能特色 手机扫码点餐功能&#xff1a;用户可…

如何评价2023年国际高校数学建模竞赛B题?

问题1&#xff1a;在三星堆发现的一个外圆直径为85厘米&#xff0c;内圆直径为40厘米&#xff08;假设&#xff09;的青铜车轮&#xff0c;青铜车轮有5条车轴&#xff08;射线&#xff09;&#xff0c;5条内弧线本质是双曲线&#xff0c;顶点与内圆相切&#xff0c;内弧双曲线的…

植物病害分级调研

Web of Science搜索&#xff0c;关键字“plant disease severity recognition”&#xff0c;共407篇&#xff0c;限制2023年以后共71篇 2019、2020 《Disentangled Representation Learning for Leaf Diseases Recognition》 2019 IF&#xff1a;0.8 论文&#xff1a;Disen…

Xcode进行真机测试时总是断连,如何解决?

嗨。大家好&#xff0c;我是兰若姐姐。最近我在用真机进行app自动化测试的时候&#xff0c;经常会遇到xcode和手机断连&#xff0c;每次断连之后需要重新连接&#xff0c;每次断开都会出现以下截图的报错 当这种情况出现时&#xff0c;之前执行的用例就相当于白执行了&#xff…

爬虫瑞数5案例:某大学总医院

声明: 该文章为学习使用,严禁用于商业用途和非法用途,违者后果自负,由此产生的一切后果均与作者无关 一、瑞数简介 瑞数动态安全 Botgate(机器人防火墙)以“动态安全”技术为核心,通过动态封装、动态验证、动态混淆、动态令牌等技术对服务器网页底层代码持续动态变换,…

Go语言并发编程-Goroutine调度

goroutine 概念 在Go中&#xff0c;每个并发执行的单元称为goroutine。通常称为Go协程。 go 关键字启动goroutine go中使用关键字 go 即可启动新的goroutine。 示例代码&#xff1a; 两个函数分别输出奇数和偶数。采用常规调用顺序执行&#xff0c;和采用go并发调用&…

大模型学习笔记十一:视觉大模型

一、判别式模型和生成式模型 1&#xff09;判别式模型Discriminative ①给某一个样本&#xff0c;判断属于某个类别的概率&#xff0c;擅长分类任务&#xff0c;计算量少。&#xff08;学习策略函数Y f(X)或者条件概率P(YIX)&#xff09; ②不能反映训练数据本身的特性 ③学习…

优思学院|直方图与条形图的具体区别

在六西格玛方法、质量管理工具中&#xff0c;数据的分析和可视化是关键步骤。直方图和条形图是两种常用的图表工具&#xff0c;但它们在用途和显示方式上有显著区别。本文将详细探讨这两种图表的定义、特性、应用及如何选择适合的图表。 1. 直方图和条形图的定义 直方图是一种…

人工智能未来发展前景将会怎样?

当我们探讨人工智能未来的发展前景时&#xff0c;可以从多个角度来详细说明其可能的影响和趋势&#xff1a; 技术进步与应用扩展 1.深度学习与机器学习&#xff1a; 进一步优化和算法进展&#xff1a;深度学习已经取得了巨大成就&#xff0c;但仍面临挑战&#xff0c;如对小数…

程序员想要6万一个月,需要什么能力,要吃什么样的苦?

让我们来算一道小学数学题&#xff1a;6w*1272w&#xff0c;年包72w的程序员起码是阿里P7-P8的水平了&#xff0c;论工作职责来说&#xff0c;起码得是大厂的一个小tech leader&#xff0c;如果是在小公司&#xff0c;基本上是公司骨干级成员&#xff0c;或是统筹整个项目和小组…

FFmpeg播放视频

VS2017+FFmpeg6.2.r113110+SDL2.30.5 1.下载 ShiftMediaProject/FFmpeg 2.下载SDL2 3.新建VC++控制台应用 3.配置include和lib 4.把FFmpeg和SDL的dll 复制到工程Debug目录下,并设置调试命令

如何让您的反爬虫策略更具弹性?揭秘管理技巧

摘要&#xff1a; 本文深入探讨了反爬虫策略的最新趋势与实战技巧&#xff0c;旨在帮助网站所有者和数据分析师构建更加灵活高效的爬虫管理系统。通过理解反爬机制、动态应对策略及合法数据采集的最佳实践&#xff0c;确保数据收集在遵守网络规则的同时&#xff0c;实现业务目…

Kettle 登录示例 POST请求

登录接口是post请求&#xff0c;组装Body为json字符串 var body "{\"username\":\""username"\",\"password\": \""password"\",\"code\":\""verification"\",\"uuid\…

YOLOv7网络结构学习

YOLOV7详细解读&#xff08;一&#xff09;网络架构解读 YOLOV7学习记录之原理代码介绍 【Make YOLO Great Again】YOLOv1-v7全系列大解析&#xff08;Backbone篇&#xff09; yolov7 图解 深入浅出 Yolo 系列之 Yolov7 基础网络结构详解 我觉得Head、Neck和Head的划分不太…