图的连通法之普里姆算法和卡鲁斯卡尔算法

最小生成树

  • 连通图:图的连通其实就是,图的最小连通图其实就是最小生成树
  • :如果一个无向连通图中不存在回路,则这种图称为树。
  • 生成树:无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树。
  • 最小生成树:或者称为最小代价树,对无向连通图的生成树,各边的权值总和称为生成树的权,权最小的生成树称为最小生成树。

这里写图片描述

这里写图片描述

  • 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树。称为最小生成树。
  • 找连通网的最小生成树,经典的有两种算法,普里姆算法克鲁斯卡尔算法

普里姆算法

  • 普里姆算法:
#代表无限大


假设以v0为基准开始,探测v0到各个顶点的距离:
v0
0, 10, #, #, #, 11, #, #, #
看到v0到v1的距离最短为10.

接下来我们要把v1加到基准里。以v0和v1为基准,探测到各个顶点的距离:
v0,v1
0, 0, 18, #, #, 11, 16, #, 12
看到到v8的举例最短为12.
这个过程前会把v0到各个顶点的距离和v1到各个顶点的距离作比较,小的留下。
=======>

v0
0, 10, #, #, #, 11, #, #, #
v1
10, 0, 18, #, #, #, 16, #, 12
可以看到相同位置的元素,18#小,11比16小,12比#小。替换后:

v0,v1
0, 0, 18, #, #, 11, 16, #, 12

=======>

就是这样不断寻找基准距离最短的顶点,将其加入基准。然后再以基准探测周围举例最短的点。一直到所有顶点都找完!

这里写图片描述

package com.cx.graphdemo;

public class Graph {
   

    private int vertexSize; // 顶点数量
    private int[] vertexs; // 顶点数组
    private int[][] matrix; // 邻接矩阵
    private static final int MAX_WEIGHT = 1000;
    private boolean[] isVisited; // 是否被访问过

    public Graph(int vertexSize) {
        this.vertexSize = vertexSize;
        vertexs = new int[vertexSize];
        matrix = new int[vertexSize][vertexSize];

        for (int i = 0; i < vertexSize; i++) {
            vertexs[i] = i;
        }

        isVisited = new boolean[vertexSize];
    }

    /**
     * prim 普里姆算法
     */
    
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值