
package com.test;
import java.util.Arrays;
// 求最小生成树----普里姆算法(Prim)
public class MiniSpanTreePrim {
public static void main(String[] args) {
// 构造最小生成树
int vertexNumber = 9;// 定点数
int arr[][] = new int[vertexNumber][vertexNumber];// 图的邻接矩阵
for (int i = 0; i < vertexNumber; i++) {
for (int j = 0; j < vertexNumber; j++) {
if (i == j) {
arr[i][j] = 0;
} else {
// arr[i][j] = Integer.MAX_VALUE;
arr[i][j] = 65535;
}
}
}
arr[0][1] = 10;
arr[0][5] = 11;
arr[1][0] = 10;
arr[1][2] = 18;
arr[1][6] = 16;
arr[1][8] = 12;
arr[2][1] = 18;
arr[2][3] = 22;
arr[2][8] = 8;
arr[3][2] = 22;
arr[3][8] = 21;
arr[3][6] = 24;
arr[3][7] = 16;
arr[3][4] = 20;
arr[4][3] = 20;
arr[4][7] = 7;
arr[4][5] = 26;
arr[5][0] = 11;
arr[5][6] = 17;
arr[5][4] = 26;
arr[6][1] = 16;
arr[6][5] = 17;
arr[6][3] = 24;
arr[6][7] = 19;
arr[7][6] = 19;
arr[7][3] = 16;
arr[7][4] = 7;
arr[8][1] = 12;
arr[8][2] = 8;
arr[8][3] = 21;
System.out.println("图的邻接矩阵:");
for (int i = 0; i < vertexNumber; i++) {
for (int j = 0; j < vertexNumber; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
}
System.out.println("------------------------");
// 开始生成最小树--prim(默认从v0开始)
int[] vertexIndex = new int[vertexNumber];// 保存顶点索引
int[] minWeightArr = new int[vertexNumber];// 保存相关顶点间的权值
// 把第一行权值存入minWeightArr
for (int i = 0; i < vertexNumber; i++) {
minWeightArr[i] = arr[0][i];// 将于v0顶点相关的顶点存入minWeight
}
for (int i = 1; i < vertexNumber; i++) {
// int minWeight = Integer.MAX_VALUE;// 最小权值
int minWeight = 65535;// 最小权值
int j = 0;// 顶点下标循环变量
int k = 0;// 最小权值顶点下标
// 找出minWeightArr中最小的权值
while (j < vertexNumber) {
if (minWeightArr[j] != 0 && minWeightArr[j] < minWeight) {
minWeight = minWeightArr[j];
k = j;
}
j++;
}
System.out.print(Arrays.toString(vertexIndex) + "\t");
System.out.print(Arrays.toString(minWeightArr) + "\t");
System.out.println("( " + vertexIndex[k] + " , " + k + " ) ");
minWeightArr[k] = 0;
// 找出第k行中,较小的权值存入minWeightArr
for (j = 1; j < vertexNumber; j++) {
if (minWeightArr[j] != 0 && arr[k][j] < minWeightArr[j]) {
minWeightArr[j] = arr[k][j];
vertexIndex[j] = k;
}
}
}
}
}
输出结果:
图的邻接矩阵:
0 10 65535 65535 65535 11 65535 65535 65535
10 0 18 65535 65535 65535 16 65535 12
65535 18 0 22 65535 65535 65535 65535 8
65535 65535 22 0 20 65535 24 16 21
65535 65535 65535 20 0 26 65535 7 65535
11 65535 65535 65535 26 0 17 65535 65535
65535 16 65535 24 65535 17 0 19 65535
65535 65535 65535 16 7 65535 19 0 65535
65535 12 8 21 65535 65535 65535 65535 0
------------------------
[0, 0, 0, 0, 0, 0, 0, 0, 0] [0, 10, 65535, 65535, 65535, 11, 65535, 65535, 65535] ( 0 , 1 )
[0, 0, 1, 0, 0, 0, 1, 0, 1] [0, 0, 18, 65535, 65535, 11, 16, 65535, 12] ( 0 , 5 )
[0, 0, 1, 0, 5, 0, 1, 0, 1] [0, 0, 18, 65535, 26, 0, 16, 65535, 12] ( 1 , 8 )
[0, 0, 8, 8, 5, 0, 1, 0, 1] [0, 0, 8, 21, 26, 0, 16, 65535, 0] ( 8 , 2 )
[0, 0, 8, 8, 5, 0, 1, 0, 1] [0, 0, 0, 21, 26, 0, 16, 65535, 0] ( 1 , 6 )
[0, 0, 8, 8, 5, 0, 1, 6, 1] [0, 0, 0, 21, 26, 0, 0, 19, 0] ( 6 , 7 )
[0, 0, 8, 7, 7, 0, 1, 6, 1] [0, 0, 0, 16, 7, 0, 0, 0, 0] ( 7 , 4 )
[0, 0, 8, 7, 7, 0, 1, 6, 1] [0, 0, 0, 16, 0, 0, 0, 0, 0] ( 7 , 3 )
普里姆算法求最小生成树
本文通过Java实现普里姆算法来寻找加权无向图的最小生成树。构造了一个包含9个顶点的图,并展示了邻接矩阵表示法。通过详细步骤解释了如何迭代选择边来形成总权重最小的生成树。
2022

被折叠的 条评论
为什么被折叠?



