普里姆算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码实现:

package DataStructure;

public class PrimDemo {
    public static void main(String[] args) {
        Graph2 graph = new Graph2(7);
        String[] vertexS = {"A", "B", "C", "D", "E", "F", "G"};
        for (String vertex : vertexS) {
            graph.insertVertex(vertex);
        }
        // A-B(5) A-C(7) A-G(2) B-D(9) B-G(3) C-E(8) D-F(4) E-G(4) E-F(5) F-G(6)
        // 100表示不连通
        int[][] weights = {
                {100, 5, 7, 100, 100, 100, 2},
                {5, 100, 100, 9, 100, 100, 3},
                {7, 100, 100, 100, 8, 100, 100},
                {100, 9, 100, 100, 100, 4, 100},
                {100, 100, 8, 100, 100, 5, 4},
                {100, 100, 100, 4, 5, 100, 6},
                {2, 3, 100, 100, 4, 6, 100}
        };
        graph.insertEdge(weights);

        primMinTree(graph, 0);
        /* output:
        A-G 权值:2
        G-B 权值:3
        G-E 权值:4
        E-F 权值:5
        F-D 权值:4
        A-C 权值:7
         */
    }

    /**
     * 普里姆算法计算最小生成树
     * @param graph 原始带权图
     * @param index 从哪个顶点开始
     */
    public static void primMinTree(Graph graph, int index) {
        // 获取顶点个数vertexNum
        int vertexNum = graph.getVertexNum();
        // 记录顶点是否被访问过
        int[] isVisited = new int[vertexNum];
        // 设置开始顶点为已访问
        isVisited[index] = 1;
        // 最小权值初始化为100
        int minWeight = 100;
        // v1 v1记录顶点下标
        int v1 = -1;
        int v2 = -1;

        // 循环vertexNum-1次,每次计算出一条边,总共vertexNum-1条边。
        for (int k = 1; k < vertexNum; k++) {
            // 遍历所有已访问顶点,并找出已访问顶点与所有与其连通的未访问顶点的最小权值
            for (int i = 0; i < vertexNum; i++) {
                for (int j = 0; j < vertexNum; j++) {
                    if (isVisited[i] == 1 && isVisited[j] == 0 && graph.getEdges()[i][j] < minWeight) {
                        minWeight = graph.getEdges()[i][j];
                        v1 = i;
                        v2 = j;
                    }
                }
            }
            isVisited[v2] = 1;
            System.out.println(graph.getVertex(v1) + "-" + graph.getVertex(v2) + " 权值:" + minWeight);
            minWeight = 100;
        }
    }
}

class Graph2 extends Graph {

    public Graph2(int n) {
        super(n);
    }

    public void insertEdge(int[][] edges) {
        this.edges = edges;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值