【短学期算法作业】Kruskal算法的实现(并查集)

简介: 【短学期算法作业】Kruskal算法的实现(并查集)

题目介绍

某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了连接两个城镇需要花费的代价。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少花费多少代价就可以完成工程?

Input

输入包含多组数据,对于每组测试数据:

第一行包含两个正整数N和M(0 <=N <=1000,0 < M < 5000),分别代表现有城镇的数目和已修建的道路的数目。城镇分别以1~N编号。

接下来是M行道路信息。每一行有三个整数A,B,X(0 < A,B <= N ,0 < X < 10000),表示可以在城镇A和城镇B之间建一条花费为X的双向道路。保证数据可以完成工程。

Output

对于每组数据,输出完成工程需要花费的最少代价。

Sample Input

3 3

1 2 3

1 3 1

2 3 2

Sample Output

3


题目思路

利用并查集来维护城市间是否连通。每次寻找花费最少且未被标记的道路并且标记,如果该道路两头未连通,则累加到总花费中。直至找不到输出总花费。


具体代码

package com.dreamchaser;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
 * kruskal算法的实现(并查集)
 */
public class test5 {
    /**
     * 记录城市连通情况
     * 下标为零的不算数
     */
    static int[] city;
    static List<Road> roads = new ArrayList<Road>();
    /**
     * 现有城镇的数目
     */
    static int n;
    /**
     * 能修建的道路的数目
     */
    static int m;
    public static void main(String[] args) {
        input();
        System.out.println("最少所需费用为:");
        System.out.println(caculate());
    }
    /**
     * 计算费用
     * 按价格遍历所有可行的道路,将未连通的道路费用加上并合并所在集合
     * @return
     */
    private static int caculate() {
        int total=0;
        Road road=findMin();
        while (road!=null){
            if (merge(road.begin, road.end)!=0){
                total+=road.money;
            }
            //标记已经遍历
            road.flag=true;
            road=findMin();
        }
        return total;
    }
    /**
     * 寻找最短可行路径
     * @return
     */
    private static Road findMin() {
        Road minRoad=null;
        for (Road road:roads){
            if (minRoad==null){
                if (!road.flag){
                    minRoad=road;
                }
            }else if(!road.flag&&road.money< minRoad.money){
                minRoad=road;
            }
        }
        return minRoad;
    }
    private static void input() {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        m = scanner.nextInt();
        //输入道路信息
        for (int i = 0; i < m; i++) {
            Road road = new Road(scanner.nextInt(), scanner.nextInt(), scanner.nextInt());
            roads.add(road);
        }
        city = new int[n+1];
    }
    /**
     * 寻找根节点
     *
     * @param i
     * @return
     */
    private static int findUnion(int i) {
        /**
         * 合并集的根
         */
        if (city[i] != 0) {
            int root = findUnion(city[i]);
            //路径压缩
            city[i] = root;
            return root;
        } else {
            return i;
        }
    }
    /**
     * 合并集合
     * 如果两个属于同一个集合则返回null,否则返回根节点
     * @param x
     * @param y
     * @return
     */
    private static int merge(int x, int y) {
        int root1 = findUnion(x);
        int root2 = findUnion(y);
        if (root1 != root2) {
            city[root2] = root1;
            return root1;
        } else {
            return 0;
        }
    }
    static class Road {
        int begin;
        int end;
        int money;
        /**
         * 标记有没有走过
         */
        Boolean flag=false;
        public Road(int begin, int end, int money) {
            this.begin = begin;
            this.end = end;
            this.money = money;
        }
    }
}



运行截图


q1.png


相关文章
|
2月前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。
|
4月前
|
算法 JavaScript 前端开发
第一个算法项目 | JS实现并查集迷宫算法Demo学习
本文是关于使用JavaScript实现并查集迷宫算法的中国象棋demo的学习记录,包括项目运行方法、知识点梳理、代码赏析以及相关CSS样式表文件的介绍。
第一个算法项目 | JS实现并查集迷宫算法Demo学习
|
3月前
|
存储 算法 Python
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
火箭般的提升!学会Python并查集,让你的算法能力飞跃新高度!
44 1
|
4月前
|
算法 计算机视觉 Python
Python并查集大揭秘:让你在算法界呼风唤雨,秒杀一切复杂场景!
在编程与算法的广袤天地中,总有一些工具如同神兵利器,能够助你一臂之力,在复杂的问题前游刃有余。今天,我们就来深入探讨这样一件神器——Python并查集(Union-Find),看看它是如何让你在算法界呼风唤雨,轻松应对各种复杂场景的。
87 2
|
4月前
|
算法 调度
作业调度算法_先来先服务算法_短作业优先算法_高响应比优先算法
本文介绍了作业调度算法,包括先来先服务(FCFS)、短进程优先(SJF)和高响应比优先(HRRN)算法。通过分析进程的到达时间和所需CPU服务时间,计算进程的开始时间、完成时间、平均周转时间和平均带权周转时间,以评估不同算法的性能。FCFS适合长作业,SJF适合短作业,而HRRN则综合了两者的优点。
191 12
|
5月前
|
算法
算法设计与分析作业
这篇文章是关于算法设计与分析的作业,其中包含了两个算法实现:一个是使用分治算法实现的十进制大整数相乘(包括加法、减法和乘法函数),并进行了正确性和健壮性测试;另一个是使用快速排序思想实现的分治查找第K小元素的程序,并分析了其平均和最坏时间复杂度。
算法设计与分析作业
|
3月前
|
机器学习/深度学习 算法 数据处理
EM算法对人脸数据降维(机器学习作业06)
本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。
48 0
|
5月前
|
DataWorks 算法 调度
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
B端算法实践问题之配置脚本以支持blink批处理作业的调度如何解决
58 1
|
7天前
|
算法 数据安全/隐私保护
室内障碍物射线追踪算法matlab模拟仿真
### 简介 本项目展示了室内障碍物射线追踪算法在无线通信中的应用。通过Matlab 2022a实现,包含完整程序运行效果(无水印),支持增加发射点和室内墙壁设置。核心代码配有详细中文注释及操作视频。该算法基于几何光学原理,模拟信号在复杂室内环境中的传播路径与强度,涵盖场景建模、射线发射、传播及接收点场强计算等步骤,为无线网络规划提供重要依据。
|
8天前
|
机器学习/深度学习 数据采集 算法
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真
本项目基于MATLAB2022a实现时间序列预测,采用CNN-GRU-SAM网络结构。卷积层提取局部特征,GRU层处理长期依赖,自注意力机制捕捉全局特征。完整代码含中文注释和操作视频,运行效果无水印展示。算法通过数据归一化、种群初始化、适应度计算、个体更新等步骤优化网络参数,最终输出预测结果。适用于金融市场、气象预报等领域。
基于GA遗传优化的CNN-GRU-SAM网络时间序列回归预测算法matlab仿真