Kruskal算法(克鲁斯卡尔)最小生成树

简介: Kruskal算法(克鲁斯卡尔)最小生成树

1、Kruskal算法设计思想

实现克鲁斯卡尔算法的关键是准确判断选取的边是否与生成树中已有边形成回路。这可以通过判断边的两个顶点所在的连通分量来解决。克鲁斯卡尔算法为此设置了一个辅助数组vset【0~n-1】,用于判断两个顶点之间是否连通。数组元素vset【i】代表编号顶点为i的顶点所属的连通顶点集的编号,当两个顶点的集合编号不同时,加入这两个顶点构成的边到最小生成树中时一定不会形成回路。克鲁斯卡尔算法采用Node数组存放图中的所有边,采用排序的方法将所有边按权值从小到大排序。

以下代码仅供参考

以下代码仅供参考

以下代码仅供参考

/**
 *作者:魏宝航
 *2020年11月23日,下午14:28
 */
import org.omg.CORBA.INTERNAL;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.Scanner;
public class MatrixUDG {
    private char[] mVexs;
    private int[][] mMatrix;
    private int num;
    public MatrixUDG(char[] vexs, char[][] edges) {
        num = vexs.length;
        mVexs = new char[num];
        for (int i = 0; i < mVexs.length; i++)
            mVexs[i] = vexs[i];
        mMatrix = new int[num][num];
        for(int i=0;i<num;i++){
            for(int j=0;j<num;j++){
                if(edges[i][j]=='∞'){
                    mMatrix[i][j]=Integer.MAX_VALUE;
                }else{
                    mMatrix[i][j]=Integer.parseInt(edges[i][j]+"");
                }
            }
        }
    }
    public void InsertSort(Node arr[],int n){
        int i=0,j=0;
        Node temp;
        for(i=1;i<n;i++){
            temp=arr[i];
            j=i-1;
            while(j>=0&&temp.w<arr[j].w){
                arr[j+1]=arr[j];
                j--;
            }
            arr[j+1]=temp;
        }
    }
    public void print() {
        System.out.printf("Martix Graph:\n");
        for (int i = 0; i < mVexs.length; i++) {
            for (int j = 0; j < mVexs.length; j++){
                if(mMatrix[i][j]<Integer.MAX_VALUE){
                    System.out.printf("%d ", mMatrix[i][j]);
                }else{
                    System.out.print("∞ ");
                }
            }
            System.out.printf("\n");
        }
    }
    public void Kruskal(){
        Node[] arr=new Node[1000];
        int m1,m2,sn1,sn2,k;
        int[] vset=new int[1000];
        k=0;
        for(int i=0;i<this.num;i++){
            for(int j=i+1;j<this.num;j++){
                if(this.mMatrix[i][j]!=0&&this.mMatrix[i][j]!=Integer.MAX_VALUE){
                    arr[k]=new Node(i,j,this.mMatrix[i][j]);
                    k++;
                }
            }
        }
        InsertSort(arr,k);
        for(int i=0;i<this.num;i++){
            vset[i]=i;
        }
        k=1;
        int j=0;
        for(;k<num;){
            m1=arr[j].u;
            m2=arr[j].v;
            sn1=vset[m1];
            sn2=vset[m2];
            if(sn1!=sn2){
                System.out.printf("边(%d,%d):%d\n",m1,m2,arr[j].w);
                k++;
                for(int i=0;i<this.num;i++){
                    if(vset[i]==sn2){
                        vset[i]=sn1;
                    }
                }
            }
            j++;
        }
    }
    public static void main(String[] args) {
        char[] vexs={'0','1','2','3','4','5'};
        char[][] edges=new char[][]{
                {'0','6','1','5','∞','∞'},
                {'6','0','5','∞','3','∞'},
                {'1','5','0','5','6','4'},
                {'5','∞','5','0','∞','2'},
                {'∞','3','6','∞','0','6'},
                {'∞','∞','4','2','6','0'},
        };
        MatrixUDG g=new MatrixUDG(vexs,edges);
        g.print();
        g.Kruskal();
    }
}
class Node implements Comparable<Node>{
    int u;
    int v;
    int w;
    Node(int u,int v,int w){
        this.u=u;
        this.v=v;
        this.w=w;
    }
    @Override
    public int compareTo(Node o) {
        return w-o.w;
    }
}


目录
相关文章
|
机器学习/深度学习 算法 数据挖掘
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
**摘要:** 了解9种距离和相似度算法:欧氏距离、余弦相似度、汉明距离、曼哈顿距离、切比雪夫距离、闵可夫斯基距离、雅卡尔指数、半正矢距离和Sørensen-Dice系数。这些算法在机器学习、文本分析、图像处理和生物学等领域各有应用。例如,欧氏距离用于KNN和K-Means,余弦相似度用于文本相似性,汉明距离在错误检测中,曼哈顿距离在数据挖掘,切比雪夫距离在棋盘游戏,闵可夫斯基距离通过调整参数适应不同场景,雅卡尔指数和Sørensen-Dice系数用于集合相似度。每种算法有其优缺点,如欧氏距离对异常值敏感,余弦相似度忽略数值大小,汉明距离仅适用于等长数据。
930 2
算法金 | 欧氏距离算法、余弦相似度、汉明、曼哈顿、切比雪夫、闵可夫斯基、雅卡尔指数、半正矢、Sørensen-Dice
|
算法 C语言
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
数据结构与算法——最小生成树问题(什么是最小生成树、Prim算法、Kruskal算法)
468 0
|
算法 搜索推荐
Kruskal算法
Kruskal算法
841 0
|
算法 C++
用prim和kruskal算法求最小生成树问题
用prim和kruskal算法求最小生成树问题
306 0
|
存储 算法 C++
最小生成树问题及Kruskal算法的解析
最小生成树问题及Kruskal算法的解析
808 2
|
监控 算法
转:克鲁斯卡尔算法在文档管理软件中应用使其更加高效
克鲁斯卡尔算法是一种用于解决最小生成树问题的贪心算法。在文档管理软件中,可以将网络节点之间的连接关系抽象为一张图,然后使用克鲁斯卡尔算法来寻找最小生成树,即最小的连接所有节点的路径。
256 0
|
存储 算法 搜索推荐
克鲁斯卡尔算法
克鲁斯卡尔算法
|
存储 算法 数据可视化
转:电子文档管理系统中应用克鲁斯卡尔算法有什么作用
克鲁斯卡尔算法是一种求解最小生成树问题的算法,其在电子文档管理系统中可以用于优化文档的管理和存储。
293 0
|
算法 Java
数据结构(13)最小生成树JAVA版:prim算法、kruskal算法
13.1.概述 最小生成树,包含图的所有顶点的一棵树,树的边采用包含在图中的原有边中权重和最小的边。翻译成人话就是遍历一遍全图所有顶点的最短路径,这条路径就叫最小生成树。 最小生成树存在和图是连通图互为充要条件,顶点都不连通,肯定不可能有路能遍历一遍全图。 求解最小生成树有两种常用算法:
979 0
|
算法 Java 内存技术
Kruskal算法求最小生成树 Java带输入输出
Kruskal算法求最小生成树 Java带输入输出
322 0

热门文章

最新文章