您的位置:首页 > 其它

最小生成树--Prim算法

2018-03-26 21:34 211 查看
条件:无向图

任意一个点作为开端,将该点的所有边加到优先级队列,表示边被解锁,从队列中弹出一条边(必是权重最小的)看该边是否已经标记,如果没标记就标记,表示这条边是需要的,然后将该边的相连的另一个点相连的所有边解锁,,,如此类推

图的表示和生成见:点击打开链接
import java.util.Comparator;
import java.util.HashSet;
import java.util.PriorityQueue;
import java.util.Set;

public class primMST {
public static class EdgeComparator implements Comparator<Edge> {
@Override
public int compare(Edge o1, Edge o2) {
return o1.weight - o2.weight;
}
}

public static Set<Edge> prime(Graph graph) {
PriorityQueue<Edge> pQueue = new PriorityQueue<Edge>(new EdgeComparator());
HashSet<Edge> edges = new HashSet<Edge>();
HashSet<Node> nodes = new HashSet<Node>();
for (Node node : graph.nodes.values()) {// 深林,要是有不同的树也可以处理
// node:当前节点,还没进过set
if (!nodes.contains(node)) {
// 加进set
nodes.add(node);
// node的所有边进优先级队列
for (Edge curEdge : node.edges) {
pQueue.add(curEdge);
}
while (!pQueue.isEmpty()) {
// 弹出一个最小权重的边(队列不为空)
Edge edge = pQueue.poll();
Node toNode = edge.to;
if (!nodes.contains(toNode)) {
nodes.add(toNode);
edges.add(edge);
//将toNode的边都解锁,加进优先级队列
for(Edge nextEdge:toNode.edges){
pQueue.add(nextEdge);
}
}
}
}
}
return edges;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: