算法复习 - 最小生成树算法 Prim、Kruskal(普里姆算法、 克鲁斯卡尔算法)

5 篇文章 0 订阅
  • MapForPK.java
package map;

/**
* Created by apple on 16/6/18.
* 使用邻接表的形式来表示图
*/
public class MapForPK {

   private int[][] paths;

   public MapForPK() {
       paths = new int[6][6];
       paths[0] = new int[]{0, 6, -1, -1, 10, 12};
       paths[1] = new int[]{6, 0, 3, 5, -1, 8};
       paths[2] = new int[]{-1, 3, 0, 7, -1, -1};
       paths[3] = new int[]{-1, 5, 7, 0, 9, 11};
       paths[4] = new int[]{10, -1, -1, 9, 0, 16};
       paths[5] = new int[]{12, 8, -1, 11, 16, 0};
   }

   public int[][] getPaths() {
       return paths;
   }
}
  • MST.java
package map;

import java.util.*;

/**
* Created by apple on 16/6/18.
*/
public class MST {

   public static void Prim(MapForPK map) {
       List<Integer> openList = new ArrayList<>();
       List<Integer> closeList = new ArrayList<>();
       for (int i = 0; i < map.getPaths().length; i++) {
           if (i == 0) {
               closeList.add(i);
               System.out.println("下一个节点是:" + i + ",距离为:0");
           } else {
               openList.add(i);
           }
       }
       while (openList.size() > 0) {
           int minDis = -1;
           int minPos = -1;
           int curPos = -1;
           for (int nextPos: openList) {
               int pos = closeList.get(0);
               int dis = map.getPaths()[pos][nextPos];
               if (dis != -1 && dis != 0) {
                   minDis = dis;
                   minPos = nextPos;
                   curPos = pos;
                   break;
               }
           }
           for (Integer pos : closeList) {
               for (int nextPos: openList) {
                   int dis = map.getPaths()[pos][nextPos];
                   if (dis != -1 && dis != 0 && dis <= minDis) {
                       minDis = dis;
                       minPos = nextPos;
                       curPos = pos;
                   }
               }
           }
           for (Integer pos : openList) {
               if (pos == minPos) {
                   openList.remove(pos);
                   break;
               }
           }
           closeList.add(minPos);
           System.out.println("下一个节点是:" + minPos + ",与节点" + curPos + "距离为:" + minDis);
       }
   }

   public static void Kruskal(MapForPK map) {
       List<Path> paths = new ArrayList<>();
       for (int i = 0; i < map.getPaths().length; i++) {
           for (int j = i+1; j < map.getPaths()[i].length; j++) {
               if (map.getPaths()[i][j]!=-1) {
                   paths.add(new Path(i, j, map.getPaths()[i][j]));
               }
           }
       }
       Collections.sort(paths, new Comparator<Path>() {
           @Override
           public int compare(Path p1, Path p2) {
               return p1.getDistance().compareTo(p2.getDistance());
           }
       });
       List<Integer> openList = new ArrayList<>();
       List<Integer> closeList = new ArrayList<>();
       closeList.add(paths.get(0).fromNode);
       closeList.add(paths.get(0).toNode);
       System.out.println("添加路径从"+paths.get(0).getFromNode()+"到"+paths.get(0).getToNode()
               +"距离"+paths.get(0).getDistance());
       paths.remove(0);
       for (int i = 0; i < map.getPaths().length; i++) {
           if (!closeList.contains(i)) {
               openList.add(i);
           }
       }
       while(openList.size() > 0) {
           for (Path path: paths) {
               if (openList.contains(path.getFromNode()) && closeList.contains(path.getToNode())) {
                   openList.remove(path.getFromNode());
                   closeList.add(path.getFromNode());
                   System.out.println("添加路径从"+path.getFromNode()+"到"+path.getToNode()
                           +"距离"+path.getDistance());
                   paths.remove(path);
                   break;
               }
               if (closeList.contains(path.getFromNode()) && openList.contains(path.getToNode())) {
                   openList.remove(path.getToNode());
                   closeList.add(path.getToNode());
                   System.out.println("添加路径从"+path.getFromNode()+"到"+path.getToNode()
                           +"距离"+path.getDistance());
                   paths.remove(path);
                   break;
               }
           }
       }
   }

   private static class Path {
       private Integer distance;
       private Integer fromNode;
       private Integer toNode;
       public Path(Integer fromNode, Integer toNode, Integer distance) {
           this.fromNode = fromNode;
           this.toNode = toNode;
           this.distance = distance;
       }

       public Integer getDistance() {
           return distance;
       }

       public Integer getFromNode() {
           return fromNode;
       }

       public Integer getToNode() {
           return toNode;
       }
   }

}
  • Hello.java
import map.MST;
import map.MapForPK;

/**
* Created by apple on 16/6/13.
*/
public class Hello {

   public static void main(String[] args) {
       MapForPK map = new MapForPK();
       System.out.println("Prim:");
       MST.Prim(map);
       System.out.println("Kruskal");
       MST.Kruskal(map);
   }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值