最小生成树-普利姆算法-Java版(无向图)
package 最小生成树之普利姆算法;
import java.lang.Integer;
class MGraph{
public int[][] arc;
public int vertices;
public MGraph(int n){
vertices = n;
arc = new int[n][n];
}
public void addEdge(int i,int j){
if(i==j){
return;
}
arc[i][j]=1;
}
}
public class Prim {
public void MiniSpanTree_Prim(MGraph G){
int min,i,j,k=0; //k仅仅作为个临时保存变量
int[] adjvex = new int[G.vertices]; //保存相关顶点下标 可以不加
int[] lowcost = new int[G.vertices];
lowcost[0] = 0;//初始化第一个第一个权值为0,即v0加入生成树
//adjvex[0] = 0;
//循环标记除下标为0外的全部顶点,初始化后就不为0了
for(i=1;i<G.vertices;i++){
lowcost[i] = G.arc[0][i];
}
System.out.println("从0开始");
for(i=1;i<G.vertices;i++){
min=Integer.MAX_VALUE;
j=1;
while(j<G.vertices){
if(lowcost[j]!=0&&lowcost[j]<min){
min = lowcost[j];
k = j;
}
j++;
}
System.out.printf("接下来到的结点值:%d,距离最小值:%d",k,min);
System.out.println();
lowcost[k]=0;
//此段循环用于使得整体lowcost最小,便于下段(上面)循环找出(输出)
for(j=1;j<G.vertices;j++){
if(lowcost[j]!=0&&G.arc[k][j]<lowcost[j]){
lowcost[j] = G.arc[k][j];
//adjvex[j] = k;
}
}
}
}
public static void main(String[] args) {
MGraph graph = new MGraph(6);
int[][] temp={{65535,6,1,5,65535,65535},
{6,65535,5,65535,3,65535},
{1,5,65535,5,6,4},
{5,65535,5,65535,65535,2},
{65535,3,6,65535,65535,6},
{65535,65535,4,2,6,65535}};
graph.arc=temp;
new Prim().MiniSpanTree_Prim(graph);
}
}