Пример #1
0
        public KruskalMst(EdgeWeightedGraph graph)
        {
            _mst = new Queue <Edge>();

            var edges = graph.Edges();

            Array.Sort(edges, (edge, edge1) => edge.CompareTo(edge1));

            var vertices = graph.Vertices();
            var uf       = new QuickFind(vertices.Length);

            var count = 0;

            while (count < edges.Length && _mst.Count < vertices.Length - 1)
            {
                var edge = edges[count];

                var v = edge.Either();
                var w = edge.Other(v);

                if (!uf.Connected(v, w))
                {
                    uf.Union(v, w);
                    _mst.Enqueue(edge);
                }

                count++;
            }
        }
Пример #2
0
    public KruskaMST(EdgeWeightedGraph g)
    {
        m_mst = new Queue <Edge>();
        MinPQ <Edge> pq = new MinPQ <Edge>(g.Edges());
        UnionFind    uf = new UnionFind(g.V());

        while (!pq.IsEmpty() && m_mst.Count < g.V() - 1)
        {
            Edge e = pq.DeleteTop();
            int  v = e.Either();
            int  w = e.Other(v);
            if (uf.Connected(v, w))
            {
                continue;
            }
            uf.Union(v, w);
            m_mst.Enqueue(e);
        }
    }
Пример #3
0
        public KruskalMinimumSpanTree(EdgeWeightedGraph g)
        {
            mst = new List <Edge>();
            var pq = new MinPriorityQueue <Edge>(g.Ecount);

            foreach (var e in g.Edges())
            {
                pq.Insert(e);
            }
            var uf = new UF(g.Vcount);

            while (!pq.IsEmpty() && mst.Count < g.Vcount - 1)
            {
                var e = pq.DelMin();
                int v = e.Either;
                int w = e.Other(v);
                if (uf.Connected(v, w))
                {
                    continue;
                }
                uf.Union(v, w);
                mst.Add(e);
            }
        }