java数据结构最经济的地下通道建设方案prim算法

简介: MX是世界上第一大传媒娱乐企业,该公司数十年的经营历史中创作了很多经典影片,此外还经营着很多的规模十分宏大世界级的主题娱乐公园。最近MX公司刚和C国X城市达成协定,共同投资建设C国国内唯一一家主题娱乐公园。

MX是世界上第一大传媒娱乐企业,该公司数十年的经营历史中创作了很多经典影片,此外还经营着很多的规模十分宏大世界级的主题娱乐公园。最近MX公司刚和CX城市达成协定,共同投资建设C国国内唯一一家主题娱乐公园。


主题公园的经营管理部门计划布设m个固定的快餐饮品供应点为游客服务。希望游客游园时,绝对不要受到快餐店补货车工作运行的影响,最好的办法就是绝对不让游客在园中看到补货车,绝对不让游客听到补货车的声音。让游客觉得在园中任何一个餐饮点随时都能买到食品和饮品,能得到无穷无尽的食品和饮品。因此设计团队想把给m个餐饮点供货的通道设置在地下,并在通道内部敷设一定的隔音材料,可是修造地下供货通道的经济代价与通道总长度成正比(每100米修造代价是M万元),花费将是非常巨大的,不过游客至上。

现在设计团队手中已经有了m个餐饮点的坐标位置(x,y)信息,你是设计团队的一员,团队交给你的工作就是规划一个地下通道建设方案,将m个餐饮点都连接起来且总修造代价尽可能地小。

随机生成m个坐标信息验证你的算法和程序,如果最终程序求解的通道规划方案不唯一,则输出其中的任一方案即可(要求m>=30)。

解题代码如下,注释的较为清楚,不在过多阐述。

import java.util.Random;
public class MyPrim {
    public static void main(String[] args) {
        Random random = new Random();
        //随机生成m个坐标信息
        int m = random.nextInt(30) + 30;
//        int m = 5;
        System.out.println("current size = " + m);
        //每个店铺与其他店铺的距离
        int[][] map = new int[m][m];
        for (int i = 0; i < m; i++) {
            //当前店铺与之后的所有店铺距离
            for (int j = i; j < m; j++) {
                if (i == j) {
                    map[i][j] = 0;
                } else {
                    //每个餐饮店最少隔100米
                    map[i][j] = random.nextInt(400) + 100;
                }
            }
            //把之前的店铺距离赋值给当前店铺
            for (int j = 0; j < i; j++) {
                map[i][j] = map[j][i];
            }
        }
        System.out.println(toString(map));
        //输出最短距离
        System.out.println(startPrim(map, m));
    }
    private static int startPrim(int[][] map, int m) {
        //总距离
        int sumDistance = 0;
        //已经选择过的餐饮店
        int[] selectedMap = new int[m];
        //默认都没访问过标记为-1
        for (int i = 0; i < m; i++) {
            selectedMap[i] = -1;
        }
        //起点默认为第一个,访问标记为0
        selectedMap[0] = 0;
        //记录求解的通道规划方案
        int startM = 0;
        int endM = 0;
        //遍历除了第一个之后的每个店铺
        for (int i = 0; i < m - 1; i++) {
            //当前店铺的最近距离
            int minDistance = Integer.MAX_VALUE;
            int minMIndex = -1;
            //遍历已经选择过得餐饮店
            for (int j = 0; j < m; j++) {
                if (selectedMap[j] == 0) {
                    //开始寻找与该店最近的店
                    int[] currentM = new int[m];
                    //得到该店与其他未被选择的店的距离
                    for (int k = 0; k < m; k++) {
                        if (selectedMap[k] != 0) {
                            //把二维数组里第j行的数据赋值给当前店铺
                            currentM[k] = map[j][k];
                        } else {
                            currentM[k] = 0;
                        }
                    }
                    //寻找最小值
                    for (int k = 0; k < m; k++) {
                        //如果距离不为0,且最小距离大于当前距离
                        if (currentM[k] != 0 && minDistance > currentM[k]) {
                            //设置最小距离为当前距离
                            minDistance = currentM[k];
                            //记录店铺下标
                            minMIndex = k;
                            //记录方案
                            startM = j;
                            endM = k;
                        }
                    }
                    //当前这个选择过的餐饮店铺的最近距离店铺找出来后,继续循环找下一个的,直到循环完毕后找到最小的那个店铺
                }
            }
            //设置minMIndex为已选择餐饮店
            selectedMap[minMIndex] = 0;
            //总距离计算
            sumDistance += minDistance;
            //输出方案
            System.out.println("m" + startM + " is connected to m" + endM+", min distance is "+minDistance+", position["+startM+", "+endM+"]");
        }
        return sumDistance;
    }
    //输出所有店铺的距离信息
    static String toString(int[][] map) {
        StringBuilder s = new StringBuilder();
        for (int[] ints : map) {
            for (int j = 0; j < ints.length; j++) {
                if ((j + 1) == ints.length)
                    s.append(ints[j]).append("\n");
                else
                    s.append(ints[j]).append(" ");
            }
        }
        return s.toString();
    }
}
目录
相关文章
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
7月前
|
设计模式 算法 搜索推荐
Java 设计模式之策略模式:灵活切换算法的艺术
策略模式通过封装不同算法并实现灵活切换,将算法与使用解耦。以支付为例,微信、支付宝等支付方式作为独立策略,购物车根据选择调用对应支付逻辑,提升代码可维护性与扩展性,避免冗长条件判断,符合开闭原则。
2033 35
|
存储 缓存 监控
上网行为监控系统剖析:基于 Java LinkedHashMap 算法的时间序列追踪机制探究
数字化办公蓬勃发展的背景下,上网行为监控系统已成为企业维护信息安全、提升工作效能的关键手段。该系统需实时记录并深入分析员工的网络访问行为,如何高效存储和管理这些处于动态变化中的数据,便成为亟待解决的核心问题。Java 语言中的LinkedHashMap数据结构,凭借其独有的有序性特征以及可灵活配置的淘汰策略,为上网行为监控系统提供了一种兼顾性能与功能需求的数据管理方案。本文将对LinkedHashMap在上网行为监控系统中的应用原理、实现路径及其应用价值展开深入探究。
270 3
|
12月前
|
人工智能 算法 NoSQL
LRU算法的Java实现
LRU(Least Recently Used)算法用于淘汰最近最少使用的数据,常应用于内存管理策略中。在Redis中,通过`maxmemory-policy`配置实现不同淘汰策略,如`allkeys-lru`和`volatile-lru`等,采用采样方式近似LRU以优化性能。Java中可通过`LinkedHashMap`轻松实现LRUCache,利用其`accessOrder`特性和`removeEldestEntry`方法完成缓存淘汰逻辑,代码简洁高效。
566 0
|
7月前
|
存储 算法 搜索推荐
《数据之美》:Java数据结构与算法精要
本系列深入探讨数据结构与算法的核心原理及Java实现,涵盖线性与非线性结构、常用算法分类、复杂度分析及集合框架应用,助你提升程序效率,掌握编程底层逻辑。
|
7月前
|
存储 人工智能 算法
从零掌握贪心算法Java版:LeetCode 10题实战解析(上)
在算法世界里,有一种思想如同生活中的"见好就收"——每次做出当前看来最优的选择,寄希望于通过局部最优达成全局最优。这种思想就是贪心算法,它以其简洁高效的特点,成为解决最优问题的利器。今天我们就来系统学习贪心算法的核心思想,并通过10道LeetCode经典题目实战演练,带你掌握这种"步步为营"的解题思维。
|
11月前
|
存储 算法 安全
Java中的对称加密算法的原理与实现
本文详细解析了Java中三种常用对称加密算法(AES、DES、3DES)的实现原理及应用。对称加密使用相同密钥进行加解密,适合数据安全传输与存储。AES作为现代标准,支持128/192/256位密钥,安全性高;DES采用56位密钥,现已不够安全;3DES通过三重加密增强安全性,但性能较低。文章提供了各算法的具体Java代码示例,便于快速上手实现加密解密操作,帮助用户根据需求选择合适的加密方案保护数据安全。
821 58
|
10月前
|
机器学习/深度学习 算法 Java
Java实现林火蔓延路径算法
记录正在进行的森林防火项目中林火蔓延功能,本篇文章可以较好的实现森林防火蔓延,但还存在很多不足,如:很多参数只能使用默认值,所以蔓延范围仅供参考。(如果底层设备获取的数据充足,那当我没说)。注:因林火蔓延涉及因素太多,如静可燃物载量、矿质阻尼系数等存在估值,所以得出的结果仅供参考。
479 5
|
10月前
|
存储 监控 安全
企业上网监控系统中红黑树数据结构的 Python 算法实现与应用研究
企业上网监控系统需高效处理海量数据,传统数据结构存在性能瓶颈。红黑树通过自平衡机制,确保查找、插入、删除操作的时间复杂度稳定在 O(log n),适用于网络记录存储、设备信息维护及安全事件排序等场景。本文分析红黑树的理论基础、应用场景及 Python 实现,并探讨其在企业监控系统中的实践价值,提升系统性能与稳定性。
657 1
|
10月前
|
存储 负载均衡 算法
我们来说一说 Java 的一致性 Hash 算法
我是小假 期待与你的下一次相遇 ~
558 1

热门文章

最新文章