您的位置:首页 > 其它

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

2016-07-03 00:35 447 查看
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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 kruskal prim