普里姆算法Java实现非递归

之前以为就是一个点不断的找最小的没有访问过的点
后来仔细看看要求 从任意一个点出发 最后的权值要一样
无非就是加一个集合存访问过的点用来遍历里面找最小的那一个



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];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值