Esempio n. 1
0
 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]);
             }
         }
     }
 }
Esempio n. 2
0
        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;
            }
        }
Esempio n. 3
0
 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());//获取二叉堆中总是最小的索引
     }
 }