package Tu;
import java.util.ArrayList;
import java.util.List;
public class MinTree {
static int MAX = Integer.MAX_VALUE;
public static void prim(int[][] graph, int n){
int min,mid,sum=0,j,i;
char[] c = new char[]{'A','B','C','D','E','F','G','E','F'};
int[] lowcost = new int[n]; //到新集合的最小权
List<Character> list=new ArrayList<Character>();
for(i=1;i<n;i++){
lowcost[i]=graph[0][i];//以0为开始,初始化lowcosgt数组
}
list.add(c[0]);
//需要n-1条边
for(i=1;i<n;i++){
min=MAX;
mid=0;
//从数组里找最小值,并将该点标记
for(j=1;j<n;j++){
if(lowcost[j]!=0&&min>lowcost[j]){
min=lowcost[j];
mid=j;
}
}
list.add(c[mid]);
//将到达该点的距离设为0表示不可达
lowcost[mid]=0;
sum=sum+min;
//在集合中加入该点后lowcost里面的值可能会发生变化
for(j=1;j<n;j++){
if(lowcost[j]!=0&&graph[mid][j]<lowcost[j]){
lowcost[j]=graph[mid][j];
}
}
}
System.out.println("sum="+sum);
}
public static void main(String args[]){
int[][] map = new int[][] {
{ 0, 10, MAX, MAX, MAX, 11, MAX, MAX, MAX },
{ 10, 0, 18, MAX, MAX, MAX, 16, MAX, 12 },
{ MAX, MAX, 0, 22, MAX, MAX, MAX, MAX, 8 },
{ MAX, MAX, 22, 0, 20, MAX, MAX, 16, 21 },
{ MAX, MAX, MAX, 20, 0, 26, MAX, 7, MAX },
{ 11, MAX, MAX, MAX, 26, 0, 17, MAX, MAX },
{ MAX, 16, MAX, MAX, MAX, 17, 0, 19, MAX },
{ MAX, MAX, MAX, 16, 7, MAX, 19, 0, MAX },
{ MAX, 12, 8, 21, MAX, MAX, MAX, MAX, 0 } };
prim(map, map.length);
}
}
lowcost[i]:表示以i为终点的边的最小权值,当lowcost[i]=0说明以i为终点的边的最小权值=0,也就是表示i点加入了集合