普利姆算法
1、应用场景-修路问题
2、最小生成树
3、普利姆算法介绍
4、普利姆算法的最为简单的理解(重点):
-
理论上7个点要6条路就可以连通,随便从一个结点(村庄)出发(假设为A),先找该结点和邻居结点(村庄)距离最小的结点(村庄),假设为B,最小路径为A–>B ,这样子A和B连通了。
把B加入已访问的集合中,则为(A,B) -
找A的其他邻居和B的其他邻居,然后找到距离A或者B最小的那个邻居结点,假设为C点,且路径为B–>C最小,则A–>B B–>C 这样A通过B可以走到C,即ABC连通了。把C加入已访问的集合中,则为(A,B,C)
-
依次往后找,上一段为(A–>B B–>C),比较A,B,C的其他邻居和A,B,C之间的距离,然后找到距离A或者B或者C最小的那个邻居结点(村庄),假设为D点,且路径为B–>D最小,则A–>B B–>C B–>D 这样A通过B可以走到C,也可以走到D,即ABCD连通了。把D加入已访问的集合中,则为(A,B,C,D)
…
-
依次循环,n节点需走n-1个次(eg:【点–点--点–点(4个结点(村庄)3条最小路径便能连通)】),就能构建出一条理论上最短的连通路径(有点贪心算法的味道了,每次都取相邻距离最小的点,并且把该点入集合,然后下次再把集合中那几个点的相邻的最小的点放入集合,把所有n个点放完也就n-1次,就构建了n-1条短路,n个村庄就能连起来互通了)
5、普利姆算法最佳实践(修路问题)
代码实现:
package com.czl.prim;
import java.lang.reflect.Array;
import java.util.Arrays;
public class PrimAlgorithm {
public static void main(String[] args) {
MinTree minTree = new MinTree();
//测试看看图是否创建成功
char[] data = new char[] {
'A', 'B', 'C', 'D', 'E', 'F', 'G'};
//邻接矩阵的关系使用二维数组表示,10000这个大数,表示两个点不连通
int[][] weight