最小生成树---Prime算法

算法步骤

首先需要了解Prime算法的基本思想:
通过每次添加一个新节点到集合,直到所有点加入停止。
原理:每次连出该集合到其它所有点的最短边保证最小生成树的权值最小
1,首先随便选一个点加入集合
2,在其余点能够与这个集合相连的条件下,遍历这个集合中的点到其它点的权值
3,找出一个距离这个集合的任意一点距离最小的边
4,把这条边加入到这个集合
5,更新这个集合之后继续重复2步骤
6,直到所有的点都加入了这个集合

构造一个图

Prime解决的是一个图的问题,我们首先要构造一个图,图的要素有三个:点的个数,点的名称,线的权值,因此可以写出如下的函数

class Graphic{
    int vertexSize;
    char[] vertex;
    int[][] edges;
    public Graphic(int vertexSize,char[] vertex, int[][] edges){
        this.vertexSize = vertexSize;
        this.vertex = vertex;
        this.edges = edges;
    }
}

上面的vertexSize代表点的个数;vertex代表点的名称集合;edges是这个图的邻接矩阵。

接下来需要对于Prime算法进行解析

先上代码

class MinTree2{
    private Graphic graph;
    public MinTree2(Graphic graph) {
        this.graph = graph;
    }
    public void showGraph(){
        for(int[] edge:graph.edges){
            System.out.println(Arrays.toString(edge));
        }
    }
    public void Prime(int v){
        int[] visisted = new int[graph.vertexSize];
        int minV = -1;
        int minI = -1;
        visisted[v] = 1;
        int minDistance = Integer.MAX_VALUE;
        for(int i = 0; i < graph.vertexSize-1; i++){
            for(int j = 0; j < graph.vertexSize; j++){
                for(int k = 0; k < graph.vertexSize; k++){
                    if(visisted[j] == 1 && visisted[k] == 0 && graph.edges[j][k] != 0
                            && graph.edges[j][k] < minDistance){
                        minV = j;
                        minI = k;
                        minDistance = graph.edges[j][k];
                    }
                }
            }
            System.out.println(graph.vertex[minV] + "--"+graph.vertex[minI] +":" +minDistance);
            visisted[minI] = 1;
            minDistance = Integer.MAX_VALUE;
        }
    }
}

在这里插入图片描述

首先对于showGraph()方法是显示当前图的邻接矩阵,Prime算法可以按照顺序依次输出我们选择的点。
对于Prime算法要点在于:
1,记录访问过的点 int[] visisted = new int[graph.vertexSize];对于visisted的下表对应着点,初始值自动设置为0,代表着没有访问过,当满足访问条件后置为1.
2,访问条件需要注意,每次确定一个点需要进入两重循环,需要满足的是一个点访问过了,也就是加入了已访问的集合,另一个点吗没有访问过,同时这个这两个点是相连且小于我们在这个循环已经确认的最小值,注意:当权值为0的时候,他是不相连的。
3,我们经过两重循环已经确认了最小值的点和最小值,还需要在保存了这个最小值后重新设置为Inter.MAX_VALUE,为了下次使用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值