思路:
1.先确认一个点查找他连接的最短路径的顶点,然后记录下该顶点,然后查到这两个顶点连接最短路径的顶点,不能出现回路,然后在判断这个三个依次累计,直到所有顶点全部连接
代码:
package com.wangyq.datastructrue.arithmetic;
/**
* 普利姆算法- 修路问题 ,最小生成树
*/
public class PrimAlgorithm {
public static void main(String[] args) {
//构建图
int[][] ints = new int[7][7];
String[] names = new String[7];
names[0] = "A";
names[1] = "B";
names[2] = "C";
names[3] = "D";
names[4] = "E";
names[5] = "F";
names[6] = "G";
for (int[] ints1 : ints) {
for (int i = 0; i < ints1.length; i++) {
ints1[i] = Integer.MAX_VALUE;
}
}
ints[0][1] = 5;
ints[0][2] = 7;
ints[0][6] = 2;
ints[1][0] = 5;
ints[1][3] = 9;
ints[1][6] = 3;
ints[2][0] = 7;
ints[2][4] = 8;
ints[3][1] = 9;
ints[3][5] = 4;
ints[4][2] = 8;
ints[4][5] = 5;
ints[4][6] = 4;
ints[5][3] = 4;
ints[5][4] = 5;
ints[5][6] = 6;
ints[6][0] = 2;
ints[6][1] = 3;
ints[6][4] = 4;
ints[6][5] = 6;
//构建最小生成树
primAlgorithm(ints,names);
}
private static void primAlgorithm(int[][] ints, String[] names) {
int[] peaks = new int[ints.length];
int min = Integer.MAX_VALUE;
int tempK = 0;
int tempJ = 0;
peaks[0] = 1;
//n个顶点有n-1条路
for (int i = 0; i < peaks.length - 1; i++) {
//重置最短路径
tempK = 0;
tempJ = 0;
min = Integer.MAX_VALUE;
//循环已经联通的顶点
for (int j = 0; j < peaks.length; j++) {
if (peaks[j] == 0) {
continue;
}
for (int k = 0; k < peaks.length; k++) {
/*
1.当前路径是通的
2.没有构成回路
3.路径比记录的小
*/
if (ints[j][k] < Integer.MAX_VALUE && peaks[k] == 0 && ints[j][k] < min) {
min = ints[j][k];
tempK = k;
tempJ = j;
}
}
}
peaks[tempK] = 1;
System.out.println("连接顶点"+names[tempJ]+"--"+names[tempK]);
}
}
}
运行结果:
连接顶点A–G
连接顶点G–B
连接顶点G–E
连接顶点E–F
连接顶点F–D
连接顶点A–C