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

来源:互联网 发布:淘宝店怎么推广最有效 编辑:程序博客网 时间:2024/05/17 03:22
  • 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
原创粉丝点击