1.算法思想
设有向图G的顶点集合为V={1,2,...,n},初始选择一个顶点加入 “已选集合”S中,选择连接S与V-S集合的最短边e=(i,j),其中i∈S,j∈V-S,将e加入树T中,j加入S,一直执行上述操作直到S=V为止。
2.JAVA代码
static int MAX = Integer.MAX_VALUE;
static void prim(int[][] graph, int n){
char[] c = new char[]{'A','B','C','D','E','F','G','E','F'};
int[] lowcost = new int[n]; 到新集合的最小权
int[] closest= new int[n];//存取前驱结点
boolean[] s = new boolean[n]; //已选入的点 记录在s集合中
s[0] = true;
for(int i=1;i<n;i++){
lowcost[i] = graph[0][i]; //初始的最短距离 是0号顶点到其他n-1个节点的距离
closest[i] = 0; //此时的前驱就是0号顶点
s[i] = false;
}
for(int i=1;i<n;i++){
int min = MAX;
int index = 0;
//遍历lowcost数组,每次找到距离集合最近的点
for(int j=1;j<n;j++){
if(!s[j] && lowcost[j]<min){
min = lowcost[j];
index = j;
}
}
s[index] = true;
System.out.println(c[closest[index]] + "到" + c[index] + " 权值:" + min);
//加入该点后,更新其它点到集合的距离
for(int j=1;j<n;j++){
if(!s[j] && lowcost[j]>graph[index][j]){
lowcost[j] = graph[index][j];
closest[j] = index;
}
}
}
}