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();
    }
}
目录
相关文章
|
11天前
|
监控 算法 网络协议
Java 实现局域网电脑屏幕监控算法揭秘
在数字化办公环境中,局域网电脑屏幕监控至关重要。本文介绍用Java实现这一功能的算法,涵盖图像采集、数据传输和监控端显示三个关键环节。通过Java的AWT/Swing库和Robot类抓取屏幕图像,使用Socket进行TCP/IP通信传输图像数据,并利用ImageIO类在监控端展示图像。整个过程确保高效、实时和准确,为提升数字化管理提供了技术基础。
47 15
|
2月前
|
算法 数据处理 C语言
C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合
本文深入解析了C语言中的位运算技巧,涵盖基本概念、应用场景、实用技巧及示例代码,并讨论了位运算的性能优势及其与其他数据结构和算法的结合,旨在帮助读者掌握这一高效的数据处理方法。
60 1
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
146 4
|
3天前
|
运维 监控 算法
企业局域网监控软件中 Java 优先队列算法的核心优势
企业局域网监控软件是数字化时代企业网络安全与高效运营的基石,犹如一位洞察秋毫的卫士。通过Java实现的优先队列算法,它能依据事件优先级排序,确保关键网络事件如异常流量、数据泄露等被优先处理,保障系统稳定与安全。代码示例展示了如何定义网络事件类并使用PriorityQueue处理高优先级事件,尤其在面对疑似风险时迅速启动应急措施。这一核心技术助力企业在复杂网络环境中稳健前行,护航业务腾飞。
49 32
|
1天前
|
存储 监控 算法
探秘局域网桌面监控:深入剖析 Java 语言核心算法
在数字化办公时代,局域网桌面监控如同企业的“智慧鹰眼”,确保工作效率与数据安全。本文以Java为载体,揭示哈希表在监控中的关键应用。通过高效的数据结构和算法,哈希表能快速索引设备连接信息,大幅提升监控的时效性和响应速度。代码示例展示了如何用Java实现设备网络连接监控,结合未来技术如AI、大数据,展望更智能的监控体系,助力企业在数字化浪潮中稳健前行。
|
1天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
14 2
|
18天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
53 20
|
17天前
|
缓存 算法 搜索推荐
Java中的算法优化与复杂度分析
在Java开发中,理解和优化算法的时间复杂度和空间复杂度是提升程序性能的关键。通过合理选择数据结构、避免重复计算、应用分治法等策略,可以显著提高算法效率。在实际开发中,应该根据具体需求和场景,选择合适的优化方法,从而编写出高效、可靠的代码。
27 6
|
18天前
|
存储 安全 Java
Java多线程编程秘籍:各种方案一网打尽,不要错过!
Java 中实现多线程的方式主要有四种:继承 Thread 类、实现 Runnable 接口、实现 Callable 接口和使用线程池。每种方式各有优缺点,适用于不同的场景。继承 Thread 类最简单,实现 Runnable 接口更灵活,Callable 接口支持返回结果,线程池则便于管理和复用线程。实际应用中可根据需求选择合适的方式。此外,还介绍了多线程相关的常见面试问题及答案,涵盖线程概念、线程安全、线程池等知识点。
104 2
|
2月前
|
存储 算法 搜索推荐
Python 中数据结构和算法的关系
数据结构是算法的载体,算法是对数据结构的操作和运用。它们共同构成了计算机程序的核心,对于提高程序的质量和性能具有至关重要的作用