P算法思路: 给定任意一个节点,保证权值最小的情况下生成最小生成树,在确定一个节点后,在该节点的所有边中找到权值最小的,结果集加入这条边,然后使用这条边的to节点在解锁一些边,找出最小权值的边 ...
对于解锁出的边存入小根堆中每次弹出最小权值的即为有效边
/**
* 最小生成树(保持树的连通性,保证权值最小)
*
* P算法:
* 首先需要指定一个节点,由一个点解锁一批边,挑出最小的,也是用优先队列
*/
public static HashSet<Edge> prim(Graph graph){
PriorityQueue<Edge> priorityQueue = new PriorityQueue<>(new EdgeComparator());
HashSet<Node> set = new HashSet<>();
HashSet<Edge> result = new HashSet<>();
for (Node value : graph.nodes.values()) {
set.add(value);
priorityQueue.addAll(value.edges);
while (!priorityQueue.isEmpty()){
Edge cur = priorityQueue.poll();
Node to = cur.to;
if(!set.contains(to)){
set.add(to);
result.add(cur);
for (Edge next : to.edges) {
if(!result.contains(next)){
priorityQueue.add(next);
}
}
}
}
break;
}
return result;
}
private static class EdgeComparator implements Comparator<Edge>{
@Override
public int compare(Edge o1, Edge o2) {
return o1.weight - o2.weight;
}
}
左神算法学习