Exemplo n.º 1
0
 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);
         }
     }
 }
Exemplo n.º 2
0
 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]);
             }
         }
     }
 }
Exemplo n.º 3
0
 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);
 }
Exemplo n.º 4
0
 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);
         }
     }
 }
Exemplo n.º 5
0
        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);
            }
        }