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();
    }
}
目录
相关文章
|
7天前
|
传感器 人工智能 监控
智慧电厂AI算法方案
智慧电厂AI算法方案通过深度学习和机器学习技术,实现设备故障预测、发电运行优化、安全监控和环保管理。方案涵盖平台层、展现层、应用层和基础层,具备精准诊断、智能优化、全方位监控等优势,助力电厂提升效率、降低成本、保障安全和环保合规。
智慧电厂AI算法方案
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
27天前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
42 1
|
29天前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
81 2
|
29天前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
60 2
|
12天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
34 6
|
7天前
|
传感器 人工智能 监控
智慧化工厂AI算法方案
智慧化工厂AI算法方案针对化工行业生产过程中的安全风险、效率瓶颈、环保压力和数据管理不足等问题,通过深度学习、大数据分析等技术,实现生产过程的实时监控与优化、设备故障预测与维护、安全预警与应急响应、环保监测与治理优化,全面提升工厂的智能化水平和管理效能。
智慧化工厂AI算法方案
|
18天前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。
|
26天前
|
存储 算法 Java
Java 中常用的数据结构
【10月更文挑战第20天】这些数据结构在 Java 编程中都有着广泛的应用,掌握它们的特点和用法对于提高编程能力和解决实际问题非常重要。
25 6
|
27天前
|
存储 Java 开发者
Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效
【10月更文挑战第19天】在软件开发中,随着项目复杂度的增加,数据结构的组织和管理变得至关重要。Java中的Map接口提供了一种优雅的方式来管理数据结构,使代码更加清晰、高效。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,帮助开发者告别混乱,提升代码质量。
27 1