之前以为就是一个点不断的找最小的没有访问过的点
后来仔细看看要求 从任意一个点出发 最后的权值要一样
无非就是加一个集合存访问过的点用来遍历里面找最小的那一个
import java.util.ArrayList;
import java.util.List;
public class Test {
public static void main(String[]ar){
map m=new map(5);
for(int i=0;i<m.dian.length;i++){
for(int ok=0;ok<m.dian.length;ok++){
if(i==ok||m.dian[i][ok]!=0) {//自己等于自己 或 对调有值 不用管
}else {
m.dian[i][ok]= (int)(Math.random()*100+10);
m.dian[ok][i]=m.dian[i][ok];//因为是无向图 对称的直接赋值
}
System.out.print(m.dian[i][ok]+" ");
}
System.out.println();
}
m.seach(0);
m.seach(1);
m.seach(2);
}
}
class map{
public boolean []visited;
public int[][]dian;
public map(int size){
visited=new boolean[size];
dian=new int[size][size];
}
static int sum=0;
public void seach(int k){//普利姆算法
System.out.println(k);
visited[k]=true;
int min=0;
int xiao=k;
List<Integer> list=new ArrayList<>();//存所有遍历的点
list.add(k);
for (int i=0;i<dian.length-1;i++){
for(int zx=0;zx<dian.length;zx++){
if(!visited[zx]) {
min=zx; break;}//遍历所有点找到一个没有访问过的点
}
for (Integer da:list) {
for (int j=0;j<dian.length;j++){//遍历所有遍历的点来找到最小的路径
if (dian[xiao][min]>dian[da][j]&&!visited[j]){//如果路径不是最小并且没有遍历过
xiao=da;//当前为顶点为xiao
min=j;
}
}
}
sum+=dian[xiao][min];//权值储存
list.add(min);//添加访问的顶点
System.out.println(min+"点权值为"+dian[xiao][min]);
visited[min]=true;//标记为访问过
}
System.out.println(sum);
sum=0;
visited=new boolean[visited.length];
}
}