最小生成树
- 连通图:图的连通其实就是树,图的最小连通图其实就是最小生成树。
- 树:如果一个无向连通图中不存在回路,则这种图称为树。
- 生成树:无向连通图G的一个子图如果是一颗包含G的所有顶点的树,则该子图称为G的生成树。
- 最小生成树:或者称为最小代价树,对无向连通图的生成树,各边的权值总和称为生成树的权,权最小的生成树称为最小生成树。
- 一个连通图的生成树是一个极小的连通子图,它含有图中全部的顶点,但只有足以构成一棵树的n-1条边。我们把构造连通网的最小代价生成树。称为最小生成树。
- 找连通网的最小生成树,经典的有两种算法,普里姆算法和克鲁斯卡尔算法。
普里姆算法
假设以v0为基准开始,探测v0到各个顶点的距离:
v0
0, 10,
看到v0到v1的距离最短为10.
接下来我们要把v1加到基准里。以v0和v1为基准,探测到各个顶点的距离:
v0,v1
0, 0, 18,
看到到v8的举例最短为12.
这个过程前会把v0到各个顶点的距离和v1到各个顶点的距离作比较,小的留下。
=======>
v0
0, 10,
v1
10, 0, 18,
可以看到相同位置的元素,18比
v0,v1
0, 0, 18,
=======>
就是这样不断寻找基准距离最短的顶点,将其加入基准。然后再以基准探测周围举例最短的点。一直到所有顶点都找完!
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 普里姆算法
*/