package basic.graph;import java.util.Collection;import java.util.HashSet;import java.util.PriorityQueue;import java.util.Set;/*** 最小生成树算法-Prim算法** 微信公众号:Java和算法学习** @author 周一*/public class Prim {public static Set<Edge> prim(Graph graph) {Collection<Node> nodes = graph.nodes.values();if (nodes.isEmpty()) {return null;}// 解锁的边按照权重值标准放到小根堆中PriorityQueue<Edge> smallEdgeQueue = new PriorityQueue<>((a, b) -> a.weight - b.weight);// 已经解锁的点Set<Node> nodeSet = new HashSet<>();Set<Edge> result = new HashSet<>();// 1.从任意节点出发来寻找最小生成树for (Node node : nodes) {if (!nodeSet.contains(node)) {// 点解锁nodeSet.add(node);// 2.此点连接的所有边解锁for (Edge edge : node.edges) {smallEdgeQueue.offer(edge);}// 3.在所有解锁的边中选最小的边,然后看这个边加入到被选取的点中后会不会形成环while (!smallEdgeQueue.isEmpty()) {// 从解锁的边中弹出最小的边Edge currentEdge = smallEdgeQueue.poll();Node toNode = currentEdge.to;// 该边的指向点未解锁,则解锁if (!nodeSet.contains(toNode)) {nodeSet.add(toNode);result.add(currentEdge);// 指向点连接的所有边解锁for (Edge edge : toNode.edges) {smallEdgeQueue.offer(edge);}}// 该边的指向点已经解锁,直接舍弃此边}// 为了防止森林,所以不break// 如果明确知道不会出现森林(或不需要防止森林),可以break// break;}}return result;}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。