【算法题解】游乐场选址问题 - Floyd算法与最优选址策略

关于低碳物流中心选址问题的MATLAB遗传算法 本人在设计毕业论文时接触到了遗传算法方面的内容,有借鉴网上一些博客的思想和代码,经过本人的修改和总结,撰写成博客,供大家参考,如有不足,还请各位大佬批评指正。 阅读详情

爱丽丝居住的城市由n个地区构成,第i个地区有pi​个居民。
这些地区由m条双向道路联接,使得对于任意两个地区可以通过这些道路相互到达。
第i条道路连接地区ui​和vi​,经过这条道路需要花费wi​的时间。
从一个地区经过若干条道路到达另一个地区所需的总时间为经过路径的时间的总和。
为了给居民们增加一些娱乐场所,爱丽丝打算选择一些地区建设游乐场。
但是由于经费问题,爱丽丝只能恰好选择2个不同的地区建设游乐场,居民们会自行选择前往距离更近的游乐场。
定义某个居民产生的代价是从居住地区到达最近游乐园所在地区所需的最少时间。
定义总代价为所有居民产生的代价的总和。
爱丽丝想要让总代价尽量小,你能帮她算出总代价最小是多少吗?

输入格式:

第一行输入2个整数n,m。表示地区数量和道路数量。
第二行输入n个整数,第i个数pi​表示第i个地区的居民数量。
接下来m行,每行输入三个整数ui​ ,vi​ ,wi​,表示地区ui​和地区vi​之间连接了一条需要花费wi​ 时间的道路。
2≤n≤300,1≤m≤105 ,1≤pi​≤105 ,1≤ui​ ,vi​≤n,ui​=vi​,1≤wi​≤105

输出格式:

输出仅一行,包含一个整数,表示最小总代价。

输入样例:

5 5
1 1 2 2 1 
3 2 2
5 1 1
3 5 9
2 4 6
2 5 7

输出样例:

17

解题思路

关键点分析

  1. ​​图论模型​​:将地区看作顶点,道路看作带权边,构建无向图
  2. ​​最短路径​​:需要计算任意两点间的最短路径
  3. ​​最优选址​​:枚举所有可能的两个选址组合,计算总代价并取最小值

算法选择

  • ​​Floyd算法​​:适合稠密图(n≤300),可以高效计算所有顶点对的最短路径
  • ​​暴力枚举​​:由于n较小,可以枚举所有可能的选址组合

代码实现与分析


cpp

复制

#include<bits/stdc++.h>
using namespace std;
#define int long long  // 使用长整型防止溢出
int C[5005][5005];    // 邻接矩阵存储最短路径
int D[5005];          // 存储每个地区的居民数量

signed main() {
    int n, m;
    cin >> n >> m;
    
    // 初始化邻接矩阵
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
            C[i][j] = 100005;  // 初始化为较大值
        }
    }
    
    // 输入居民数量并初始化对角线
    for(int i = 1; i <= n; i++) {
        cin >> D[i];
        C[i][i] = 0;  // 自身到自身距离为0
    }
    
    // 输入道路信息
    for(int i = 1; i <= m; i++) {
        int a, b, c;
        cin >> a >> b >> c;
        C[a][b] = min(C[a][b], c);  // 处理重边,取最小值
        C[b][a] = C[a][b];          // 无向图对称
    }
    
    // Floyd算法计算所有点对最短路径
    for(int k = 1; k <= n; k++) {
        for(int i = 1; i <= n; i++) {
            for(int j = 1; j <= n; j++) {
                C[i][j] = min(C[i][j], C[i][k] + C[k][j]);
            }
        }
    }
    
    // 枚举所有可能的选址组合
    int sum = 100005;  // 初始化为较大值
    for(int i = 1; i <= n; i++) {
        for(int j = 1; j <= n; j++) {
            if(i == j) continue;  // 跳过相同地区
            int num = 0;
            // 计算总代价
            for(int k = 1; k <= n; k++) {
                num += D[k] * min(C[k][i], C[k][j]);
            }
            sum = min(sum, num);  // 更新最小值
        }
    }
    
    cout << sum << endl;
    return 0;
}

代码解析

  1. ​​初始化阶段​​:

    • 邻接矩阵C初始化为较大值(100005)
    • 对角线元素设为0(地区到自身距离为0)
  2. ​​输入处理​​:

    • 读取居民数量存入数组D
    • 读取道路信息,处理可能的重边(取最小权值)
  3. ​​Floyd算法​​:

    • 三重循环动态更新所有点对的最短路径
    • 时间复杂度O(n³),对于n=300是可接受的
  4. ​​最优选址计算​​:

    • 双重循环枚举所有可能的两个不同地区组合
    • 对于每个组合,计算所有居民到最近游乐场的总代价
    • 维护最小总代价sum
  5. ​​输出结果​​:打印最小总代价

复杂度分析

  • ​​时间复杂度​​:

    • Floyd算法:O(n³) = 300³ = 27,000,000次操作
    • 选址枚举:O(n²·n) = 300²×300 = 27,000,000次操作
    • 总复杂度:O(n³),对于n=300是可接受的
  • ​​空间复杂度​​:

    • 邻接矩阵:O(n²) = 300×300 = 90,000个int
    • 居民数组:O(n) = 300个int

 

【物流选址】佛洛依德算法求解物流选址问题【含Matlab源码 892期】 佛洛依德算法求解物流选址问题 完整的代码,方可运行;可提供运行操作视频!适合小白! 阅读详情

相关推荐

MATLAB遗传算法在需求分级选址问题中的应用

遗传算法作为一种模仿自然进化过程的搜索算法,已经成为解决优化问题的重要工具。MATLAB作为强大的数值计算和工程仿真平台,提供了遗传算法工具箱,以方便用户在求解优化问题时更加高效地实现遗传算法。本章将详细介绍MATLAB遗传算法工具箱的安装、配置、主要函数、以及高级特性。MATLAB遗传算法工具箱提供了一系列函数和接口,使得用户可以便捷地应用遗传算法来解决实际问题。工具箱支持单目标和多目标优化问题,并提供了强大的参数配置和定制功能。ga: 这是工具箱中的主要函数,用于执行遗传算法。

weixin_42599558的博客 807

选址问题

选址问题   设施选址问题(Facility Location Problem)自20世纪60年代初期以来,在运筹学中一直占据着中心位置。它来自于工厂、仓库、超市、学校、医院、图书馆、火车站、代理服务器、传感器等位置的确定问题。   设施选址问题是NP-难解问题,除非P=NP,设施选址问题不存在多项式时间算法。   P问题:   一个问题可以在多项式(O(n^k))的时间复杂度内解决。...

weixin_30787531的博客 1万+

设施选址问题的近似算法

设施选址问题的近似算法,花钱买的电子版,是图片PDF。

选址问题、模型与算法

背景音乐:Demons - Imagine Dragons 最近在研究选址问题,顺便就做了一个归纳整理。 这篇文章是第一部分,关于传统的、基于统计学的选址。 之后会有另一篇,是关于机器学习、深度学习在现代的选址问题的应用。 以下内容纯理论~~ 1 选址问题 【来自百度】选址问题是运筹学中经典的问题之一。选址问题在生产生活、物流、甚至军事中都有着非常广泛的应用,如工厂、仓库、急救中心...

weixin_39334709的博客 3万+

智能优化算法选址,源代码,有注解,能运行.zip

智能优化算法选址,源代码,有注解,能运行

物流中心选址遗传算法

使用遗传算法实现的物流配送中心选址代码,直接修改可使用

蚁群算法求解TSP问题

蚁群算法求解tsp问题

gentleman597的博客 961

关于多目标选址规划问题的flod算法matlab代码实现

关于多目标选址规划问题的flod算法matlab代码实现。

基于头脑风暴算法的物流中心选址

摘要:本文主要介绍基于头脑风暴算法的物流中心选址算法。

Jack旭的博客 687

Innovus ECO技巧:用setEcoMode+ecoAddRepeater实现批量buffer替换的5个关键步骤

本文详细介绍了在Cadence Innovus工具中,利用setEcoMode与ecoAddRepeater命令实现高效、批量Buffer/Inverter替换的工程化策略。通过启用批处理模式、构建可维护的替换规则、掌握高级定位技巧以及规避布线陷阱等5个关键步骤,帮助芯片设计工程师在ECO阶段大幅提升修改效率与质量,确保设计稳定签核。

d6e7f8的博客 1115

晶圆测试厂wafer map管理建议

按照Recipe设定bin定义 应有版本管理概念,一般使用最新版本做为活动版本即可 Bin明细中应包含 BinID、BinCode、BinName、BinType、BinColor、Description BinID可使用数字类型 BinCode可参照实际机台的Bin,用于匹配 有些公司也将BinID、BinCode理解为SBin和HBin 即 Software Bin & Hardware Bin 一般也将BinID对应到客户的Bin BinType

凯神做开发 1万+

2013数据结构课程设计之便利店选址(暴力枚举或随机函数或三分)

[问题描述] 某小区决定在小区内部建一家便利店,现小区内部共有八栋楼,它们的地理坐标分别为:(10,20) (30,34) (19,25) (38,49.1) (9,38.1) (2,34) (5,8)  (29,48)。同时,其中的住户人数分别为:30, 45, 28, 8, 36, 16, 78, 56。为了方便更多的住户购物,要求实现总体最优,请问便利店应该建立在哪里? 【提示】 1

布生气 4099

win10下Miracast无线投屏使用教程及异常解决方案(超详细)

文章目录一、什么是Miracast?二、主流的无线投屏技术有哪些特点?三、如何查看自己的win10电脑是否支持Miracast无线投屏功能?四、win10电脑如何使用Miracast无线投屏功能? 一、什么是Miracast? Miracast是由Wi-Fi联盟于2012年所制定,以Wi-Fi直连(Wi-Fi Direct)为基础的无线显示标准。支持此标准的3C设备(如智能手机、电视、投影、电脑等...

帅气的小白的博客 44万+

算法第一次作业-邮局选址问题

一、运行环境: Win7、MyEclipse、JDK8 二、运行过程说明: 数据文件格式:第一行是居民数量n的取值,第2~n+1行是每家的位置及权重。 输入格式:输入测试数据集文件编号。 输出: 排序后X轴坐标 排序后X轴坐标对应权值 排序后Y轴坐标 排序后Y轴坐标对应的权值 邮局位置 三、算法设计 3.1问题描述: 在一个按照东西和南北方向划分...

小红花yu 3880

科研党福音:如何用Zotero+Paper Agent打造你的AI论文速递系统(附详细配置教程)

本文为科研工作者提供了一套利用Zotero和开源工具Paper Agent构建自动化AI论文速递系统的详细教程。该系统能基于用户在Zotero中的文献库智能学习研究兴趣,每日自动从arXiv等平台筛选、下载并深度解读最相关的前沿论文,生成个性化日报,实现从被动接收到主动精准获取的知识工作流重塑。

kite3的博客 510

手把手教你用STM32硬件SPI驱动BMI088陀螺仪(附完整代码)

本文提供了一份详尽的STM32硬件SPI驱动BMI088陀螺仪的实战指南。内容涵盖从硬件连接、SPI底层配置、驱动层封装到设备初始化、数据读取与同步策略,并深入探讨了数据处理、滤波融合及温度补偿等核心技巧,旨在帮助开发者构建稳定高效的IMU驱动框架,解决BMI088应用中常见的挑战。

quiet的专栏 528

群体智能之粒子群优化(PSO)

获取更多资讯,赶快关注上面的公众号吧! 文章目录第二章 粒子群优化算法2.1 粒子群优化2.1.1 算法思想2.1.2 粒子群优化过程2.1.3 解读更新等式2.2 粒子群优化中的参数参考文献 第二章 粒子群优化算法 粒子群优化(PSO)是一种基于群体智能的数值优化算法,由社会心理学家James Kennedy和电气工程师Russell Eberhart于1995年提出。自PSO诞生以来,它在许...

松间沙路的博客 7545

Android 11系统定制:如何彻底隐藏状态栏电池图标(RK3568实测)

本文详细解析了在Android 11系统上如何通过多维度修改实现状态栏电池图标的彻底隐藏,特别针对RK3568平台提供了实战指南。从系统UI架构解析到核心配置文件修改,再到进阶技巧与疑难排查,帮助开发者深度定制Android系统,满足特定场景需求。

weixin_29250573的博客 372

光骓者的荣耀

题目: 小 K 又在做白日梦了。他进入到他的幻想中,发现他打下了一片江山。 小 K 打下的江山一共有nn个城市,城市ii和城市i+1i+1有一条双向高速公路连接,走这条路要耗费时间a_iai​ 小 K 为了关心人民生活,决定定期进行走访。他每一次会从11号城市到nn号城市并在经过的城市进行访问。其中终点必须为城市nn。 不仅如此,他还有一个传送器,传送半径为kk,也就是可以传送到i-ki−k和i+ki+k。如果目标城市编号小于11则为11,大于nn则为nn. 但是他的传送器电量不足,只能传送一次,

m0_51980123的博客 603

基于AOD-Net与GAN的深度学习去雾算法开发

本文提出一种结合AOD-Net与GAN的深度学习去雾算法。通过改进的AOD-GAN网络架构,集成风格迁移模块,设计包含对抗损失、内容损失和风格损失的复合目标函数。实验表明,该方法在PSNR(24.67)、SSIM(0.92)和FID(32.15)指标上优于传统方法,实现了端到端的物理模型引导图像去雾。未来将优化多尺度特征融合和轻量化部署。

huanghm88的专栏 593

5. SAP UI5 视图控制器(Controller)初探

本教程的前一个步骤也就是第四个步骤,我们了解了 SAP UI5 XML 视图的使用方法。在该步骤里,我们在 XML 视图里声明了一个 Text 控件实例,该控件位于 sap.m 这个命名空间内。 本步骤会继续接触 SAP UI5 MVC 框架中三大基石的另一块:C - Controller,即控制器。 先看看本步骤完成之后,我们得到的 SAP UI5 应用能实现一个什么样的效果。 访问如下 url: http://localhost:8080/webapp/index.html 能看到一个 Say Hell

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 4592

【走迷宫】c++

题目描述: NowCoder最喜欢游乐场的迷宫游戏,他和小伙伴们比赛谁先走出迷宫。 现在把迷宫的地图给你,你能帮他算出最快走出迷宫需要多少步吗? 输入描述: 输入包含多组数据。 每组数据包含一个10*10,由“#”和“.”组成的迷宫。其中“#”代表墙;“.”代表通路。 入口在第一行第二列;出口在最后一行第九列。 从任意一个“.”点都能一步走到上下左右四个方向的“.”点。 输出描述: 对应...

Willing_hope的博客 1629

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

【优化选址】基于matlab遗传算法求解物流配送中心选址【含Matlab源码 1917期】

遗传算法求解物流配送中心选址 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

城市规划

链接:https://www.nowcoder.com/acm/contest/180/C 来源:牛客网   题目描述 小a的国家里有n个城市,其中第i和第i - 1个城市之间有无向道路连接,特殊的,第1个城市仅与第2个城市相连 为了减轻道路维护负担,城市规划局局长MXT给出了m个要求,他想让小a断开一些道路,使得任意1 ≤ i ≤ m ,城市xi不能到达城市yi 同时最小化断开道路的数量...

海绵的博客 378

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

7-3 公路(2023CSP-J)

小苞准备开着车沿着公路自驾。公路上一共有 n 个站点,编号为从 1 到 n。其中站点 i 与站点 i+1 的距离为 ui 公里。公路上每个站点都可以加油,编号为 i 的站点一升油的价格为 ai 元,且每个站点只出售整数升的油。小苞想从站点 1 开车到站点 n,一开始小苞在站点 1 且车的油箱是空的。已知车的油箱足够大,可以装下任意多的油,且每升油可以让车前进 d 公里。问小苞从站点 1 开到站点 n,至少要花多少钱加油?

2301_81991033的博客 555

用Floyd算法解决选址问题(附完整matlab代码)

以2021年五一建模比赛中的消防站选址为例,此问题为重心性加权最优选址问题。可考虑各区域的出警次数和人口密度,并对其进行加权分析处理。 首先用Floyd算法求出距离矩阵,在考虑出警次数和人口密度的前提下找出已知距离图的15个重心点,数值最小点即为新建消防站点。若要在2021-2029年每隔3年新建1个消防站,则根据所求的15个顶点从最优到次优进行排序选址。 直接上代码: function [D,R] = floyd(A) n=size(a,1);D=a; for i=1:n f...

m0_58024423的博客 6607
上一篇: 【天梯赛题解】L1-6 吉老师的回归 - 字符串处理与逻辑判断
下一篇: 7-10 模拟炸弹人题解
loopdeloop
博客等级 码龄4年 219粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值