package A;
import java.util.*;
public class Question002 {
static int MAX = Integer.MAX_VALUE;
public static void main(String[] args) {
double[][] map = new double[][] {
{0,80,MAX,MAX,MAX,MAX,MAX,MAX},
{80,0,20,20,MAX,MAX,MAX,MAX},
{MAX,20,MAX,MAX,MAX,MAX,MAX,MAX},
{MAX,20,MAX,MAX,50,MAX,MAX,MAX},
{MAX,MAX,MAX,50,MAX,83,MAX,MAX},
{MAX,MAX,MAX,MAX,83,0,10,MAX},
{MAX,MAX,MAX,MAX,MAX,10,0, 11.5},
{MAX,MAX,MAX,MAX,MAX,MAX,11.5,0},};
prim(map, map.length);
}
public static void prim(double[][] map, int n){
char[] c = new char[]{'A','B','C','D','E','F','G','E','F'};
double[] lowcost = new double[n]; //到新集合的最小权
int[] mid= new int[n];//存取前驱结点
List<Character> list=new ArrayList<Character>();//用来存储加入结点的顺序
int i, j, minid ;
double sum = 0;
double min;
//初始化辅助数组
for(i=1;i<n;i++)
{
lowcost[i]= map[0][i];
mid[i]=0;
}
list.add(c[0]);
//一共需要加入n-1个点
for(i=1;i<n;i++)
{
min=MAX;
minid=0;
//每次找到距离集合最近的点
for(j=1;j<n;j++)
{
if(lowcost[j]!=0&&lowcost[j]<min)
{
min=lowcost[j];
minid=j;
}
}
if(minid==0) return;
list.add(c[minid]);
lowcost[minid]=0;
sum+=min;
System.out.println(c[mid[minid]] + "到" + c[minid] + " 权值:" + min);
//加入该点后,更新其它点到集合的距离
for(j=1;j<n;j++)
{
if(lowcost[j]!=0&&lowcost[j]>map[minid][j])
{
lowcost[j]=(int) map[minid][j];
mid[j]=minid;
}
}
}
System.out.println("sum:" + 2*sum);
}
}
G到E应该是11.5为什么是11.0
是因为你发的问题第56行有强制类型转换,double转int只保留整数部分。
有帮助,麻烦点个采纳,谢谢