private void visit(EdgeWightedGraph g, Int32 v) { marked[v] = true; foreach (Edge e in g.Adj(v)) { int w = e.Other(v); if (marked[w]) { continue;//访问过了 } if (e.Weight < disTo[w]) { //从MST到w的距离变短了。最佳边变成e edgeTo[w] = e; disTo[w] = e.Weight; if (pq.Contains(w)) { pq.Change(w, disTo[w]); } else { pq.Insert(w, disTo[w]); } } } }
public KruskalMST(EdgeWightedGraph g) { mst = new Edge[g.V - 1]; //保存边序列 var pq = new Chapter2.SortDemos.BinaryHeap <Edge>(g.E, (Edge e1, Edge e2) => e1.Weight < e2.Weight); //最小堆 foreach (var edge in g.Edges()) { pq.Insert(edge); } var uf = new Chapter1.UnionFindDemo.UnionFind(g.V);//判断v是否已经在一个子树中 int index = 0; while (!pq.IsEmpty()) { var edge = pq.Delete(); int v = edge.Either(); int w = edge.Other(v); if (uf.IsConnected(v, w))//不在一个子树中(一个连通分量) { continue; } uf.Union(v, w); mst[index++] = edge; weight += edge.Weight; } }
private Chapter2.SortDemos.IndexPriorityQueue <Double> pq; //保存最小边的最小堆 public PrimMST(EdgeWightedGraph g) { pq = new Chapter2.SortDemos.IndexPriorityQueue <double>(g.V, (Double s, Double b) => { return(s < b); });//允许的标号[0,g.V] edgeTo = new Edge[g.V]; marked = new Boolean[g.V]; disTo = new Double[g.V]; for (Int32 v = 0; v < g.V; ++v) { disTo[v] = Double.PositiveInfinity; //表示为正无穷 } pq.Insert(0, 0.0); disTo[0] = 0.0; while (!pq.IsEmpty()) { visit(g, pq.DeleteMin());//获取二叉堆中总是最小的索引 } }