代码如下:
public class Prim {
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] = 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("最小生成树为:");
minSpanTree_Prim(arr);
}
public static void minSpanTree_Prim(int[][] arr){
int min,j,k;
int count =0;
int[] adjvex = new int[arr.length]; //保存相关顶点下标
int[] lowcast = new int[arr.length]; //保存相关点间边的权值
lowcast[0] = 0; //初始化第一个权值为0,即v0加入生成树
//lowcast的值为0,在这里就是此下标的顶点已经加入生成树
adjvex[0] =0; //初始化第一个顶点下标为0
for(int i=1;i<arr.length;i++){ //循环除下标为0的全部顶点
lowcast[i] = arr[0][i]; //将v0顶点与之有边的权值存入数组
adjvex[i] =0; //初始化都为v0的下标
}
for(int i=1;i<arr.length;i++){
min = 65535; //初始化最小权值为65535
j=1;k=0;
while(j<arr.length){ //循环全部顶点
if(lowcast[j]!=0&&lowcast[j]<min){ //如果权值不为零且权值小于min
min = lowcast[j]; //则让当前权值成为最小值
k=j; //则将当前最小的下标存入k
}
j++;
}
count+=lowcast[k];
System.out.println(adjvex[k]+" "+k+" "+count);//打印当前顶点边中权值最小边
lowcast[k] =0;//将当前顶点的权值置为0,表示此顶点已经完成任务
for(j =1;j<arr.length;j++){
if(lowcast[j]!=0&&arr[k][j]<lowcast[j]){
//若下标为k顶点各边权值小于此前这些顶点未被加入生成树权值
lowcast[j]=arr[k][j]; //将较小权值存入lowcast
adjvex[j]=k; //将下标为k的顶点存入adjvex
}
}
}
}
}