public void addEdge(Edge e)
 {
     int v = e.either;
     int w = e.other(v);
     adj[v].Add(e);
     adj[w].Add(e);
     _E++;
 }
Example #2
0
    public BoruvkaMST(EdgeWeightedGraph ewg)
    {
        this.mst = new Bag();
        UF  uF  = new UF(ewg.V());
        int num = 1;

        while (num < ewg.V() && this.mst.size() < ewg.V() - 1)
        {
            Edge[]   array    = new Edge[ewg.V()];
            Iterator iterator = ewg.edges().iterator();
            while (iterator.hasNext())
            {
                Edge edge = (Edge)iterator.next();
                int  num2 = edge.either();
                int  num3 = edge.other(num2);
                int  num4 = uF.find(num2);
                int  num5 = uF.find(num3);
                if (num4 != num5)
                {
                    if (array[num4] == null || BoruvkaMST.less(edge, array[num4]))
                    {
                        array[num4] = edge;
                    }
                    if (array[num5] == null || BoruvkaMST.less(edge, array[num5]))
                    {
                        array[num5] = edge;
                    }
                }
            }
            for (int i = 0; i < ewg.V(); i++)
            {
                Edge edge = array[i];
                if (edge != null)
                {
                    int num2 = edge.either();
                    int num3 = edge.other(num2);
                    if (!uF.connected(num2, num3))
                    {
                        this.mst.add(edge);
                        this.weight += edge.weight();
                        uF.union(num2, num3);
                    }
                }
            }
            num += num;
        }
        if (!BoruvkaMST.s_assertionsDisabled && !this.check(ewg))
        {
            throw new AssertionError();
        }
    }
Example #3
0
    private double weight;                      // weight of MST



    public BoruvkaMST(EdgeWeightedGraph G)
    {
        UF uf = new UF(G.V());

        // repeat at most log V times or until we have V-1 edges
        for (int t = 1; t < G.V() && mst.size() < G.V() - 1; t = t + t)
        {
            // foreach tree in forest, find closest edge
            // if edge weights are equal, ties are broken in favor of first edge in G.edges()
            Edge[] closest = new Edge[G.V()];
            foreach (Edge e in G.edges())
            {
                int v = e.either(), w = e.other(v);
                int i = uf.find(v), j = uf.find(w);
                if (i == j)
                {
                    continue;           // same tree
                }
                if (closest[i] == null || less(e, closest[i]))
                {
                    closest[i] = e;
                }
                if (closest[j] == null || less(e, closest[j]))
                {
                    closest[j] = e;
                }
            }

            // add newly discovered edges to MST
            for (int i = 0; i < G.V(); i++)
            {
                Edge e = closest[i];
                if (e != null)
                {
                    int v = e.either(), w = e.other(v);
                    // don't add the same edge twice
                    if (!uf.connected(v, w))
                    {
                        mst.Add(e);
                        weight += e.Weight();
                        uf.union(v, w);
                    }
                }
            }
        }
    }
    private void scan(EdgeWeightedGraph edgeWeightedGraph, int num)
    {
        if (!LazyPrimMST.s_assertionsDisabled && this.marked[num])
        {
            throw new AssertionError();
        }
        this.marked[num] = true;
        Iterator iterator = edgeWeightedGraph.adj(num).iterator();

        while (iterator.hasNext())
        {
            Edge edge = (Edge)iterator.next();
            if (!this.marked[edge.other(num)])
            {
                this.pq.insert(edge);
            }
        }
    }
Example #5
0
    private void prim(EdgeWeightedGraph G, int s)
    {
        scan(G, s);
        while (!pq.isEmpty())
        {                                        // better to stop when mst has V-1 edges
            Edge e = pq.delMin();                // smallest edge on pq
            int  v = e.either(), w = e.other(v); // two endpoints

            if (marked[v] && marked[w])
            {
                continue;                              // lazy, both v and w already scanned
            }
            mst.Enqueue(e);                            // add e to MST
            weight += e.Weight();
            if (!marked[v])
            {
                scan(G, v);                           // v becomes part of tree
            }
            if (!marked[w])
            {
                scan(G, w);                           // w becomes part of tree
            }
        }
    }
 private bool check(EdgeWeightedGraph edgeWeightedGraph)
 {
     double num = (double)0f;
     Iterator iterator = this.edges().iterator();
     while (iterator.hasNext())
     {
         Edge edge = (Edge)iterator.next();
         num += edge.weight();
     }
     double num2 = 1E-12;
     if (java.lang.Math.abs(num - this.weight()) > num2)
     {
         System.err.printf("Weight of edges does not equal weight(): %f vs. %f\n", new object[]
         {
         java.lang.Double.valueOf(num),
         java.lang.Double.valueOf(this.weight())
         });
         return false;
     }
     UF uF = new UF(edgeWeightedGraph.V());
     Iterator iterator2 = this.edges().iterator();
     while (iterator2.hasNext())
     {
         Edge edge2 = (Edge)iterator2.next();
         int num3 = edge2.either();
         int i = edge2.other(num3);
         if (uF.connected(num3, i))
         {
             System.err.println("Not a forest");
             return false;
         }
         uF.union(num3, i);
     }
     iterator2 = edgeWeightedGraph.edges().iterator();
     while (iterator2.hasNext())
     {
         Edge edge2 = (Edge)iterator2.next();
         int num3 = edge2.either();
         int i = edge2.other(num3);
         if (!uF.connected(num3, i))
         {
             System.err.println("Not a spanning forest");
             return false;
         }
     }
     iterator2 = this.edges().iterator();
     while (iterator2.hasNext())
     {
         Edge edge2 = (Edge)iterator2.next();
         uF = new UF(edgeWeightedGraph.V());
         Iterator iterator3 = this.edges().iterator();
         while (iterator3.hasNext())
         {
             Edge edge3 = (Edge)iterator3.next();
             int num4 = edge3.either();
             int i2 = edge3.other(num4);
             if (edge3 != edge2)
             {
                 uF.union(num4, i2);
             }
         }
         iterator3 = edgeWeightedGraph.edges().iterator();
         while (iterator3.hasNext())
         {
             Edge edge3 = (Edge)iterator3.next();
             int num4 = edge3.either();
             int i2 = edge3.other(num4);
             if (!uF.connected(num4, i2) && edge3.weight() < edge2.weight())
             {
                 System.err.println(new StringBuilder().append("Edge ").append(edge3).append(" violates cut optimality conditions").toString());
                 return false;
             }
         }
     }
     return true;
 }