最小生成树--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;
}
}
任意一个点作为开端,将该点的所有边加到优先级队列,表示边被解锁,从队列中弹出一条边(必是权重最小的)看该边是否已经标记,如果没标记就标记,表示这条边是需要的,然后将该边的相连的另一个点相连的所有边解锁,,,如此类推
图的表示和生成见:点击打开链接
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;
}
}
相关文章推荐
- POJ 1251 最小生成树prim算法
- poj 2485 prim算法最小生成树
- POJ-2031 最小生成树(prim算法)
- 最小生成树-Prim算法和Kruskal算法
- 最小生成树 (Minimum Spanning Tree,MST) --- Prim算法
- hdu 1162 Eddy's picture (Kruskal算法,prim算法,最小生成树)
- 最小生成树之Prim算法
- 最小生成树Prim算法
- hdu--1863畅通工程2(典型的最小生成树)prim算法
- Prim算法构造最小生成树
- 【数据结构】求最小生成树的权值之和——Prim算法
- 最小生成树(prim算法)
- 最小生成树—kruskal算法和prim算法
- 最小生成树-Prim算法和Kruskal算法
- B - Networking——最小生成树_Prim算法(未堆优化)
- POJ-2421 Constructing Roads(最小生成树 prim算法)
- 最小生成树——Prim算法
- POJ-2349 Arctic Network(最小生成树 prim算法)
- 最小生成树算法 prim算法
- 最小生成树~Prim算法