算法复习 - 最小生成树算法 Prim、Kruskal(普里姆算法、 克鲁斯卡尔算法)
2016-07-03 00:35
447 查看
MapForPK.java
MST.java
Hello.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); } }
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- C#递归算法之分而治之策略
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- C#算法之大牛生小牛的问题高效解决方法
- C#算法函数:获取一个字符串中的最大长度的数字
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- 经典排序算法之冒泡排序(Bubble sort)代码
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法