public LazyPrimMST(IEdgeWeightGraph g) { pq = new MinPQ <IEdge>(); marked = new bool[g.V]; mst = new Chapter1.Queue <IEdge>(); Visit(g, 0);//假设G是联通的 while (!pq.IsEmpty) { IEdge e = pq.Delete(); //找到权重最小的边 int v = e.Either; int w = e.Other(v); if (marked[v] && marked[w]) //跳过失效的边 { continue; } mst.Enqueue(e); //将边添加到树中 if (!marked[v]) { Visit(g, v); } if (!marked[w]) { Visit(g, w); } } }
private void Visit(IEdgeWeightGraph g, int v) { marked[v] = true; foreach (var e in g.Adj(v)) { int w = e.Other(v); if (marked[w]) { continue; } if (e.Weight < distTo[w]) //更新最佳的边 { edgeTo[w] = e; distTo[w] = e.Weight; if (pq.Contains(w)) { pq.ChangeKey(w, distTo[w]); } else { pq.Insert(w, distTo[w]); } } } }
private static void ShowMSTResult(IEdgeWeightGraph G, IMST mst) { //StdOut.Println(G.ToString()); foreach (var edge in mst.Edges()) { StdOut.Println(edge); } StdOut.Println(mst.Weight); }
private void Visit(IEdgeWeightGraph g, int v) { //标记顶点v并将所有链接v和未被标记的顶点加入pq marked[v] = true; foreach (var edge in g.Adj(v)) { if (!marked[edge.Other(v)]) { pq.Insert(edge); } } }
private IndexMinPQ <double> pq; //有效的横切边 public PrimeMST(IEdgeWeightGraph G) { edgeTo = new Edge[G.V]; distTo = new double[G.V]; marked = new bool[G.V]; for (int v = 0; v < G.V; v++) { distTo[v] = Double.PositiveInfinity; } pq = new IndexMinPQ <double>(G.V); distTo[0] = 0.0; pq.Insert(0, 0.0); //顶点0权重初始化 while (!pq.IsEmpty) { Visit(G, pq.DeleteMin()); } }
public KruskalMST(IEdgeWeightGraph G) { mst = new Chapter1.Queue <IEdge>(); MinPQ <IEdge> pq = new MinPQ <IEdge>(); foreach (var e in G.Edges()) { pq.Insert(e); } UF uf = new UF(G.V); while (!pq.IsEmpty && mst.Size < G.V - 1) { IEdge e = pq.Delete(); //找到权重最小的边 int v = e.Either, w = e.Other(v); if (uf.Connected(v, w)) //忽略失效的边 { continue; } uf.Union(v, w); mst.Enqueue(e); } }