Пример #1
0
        public KruskalMST(Graph g)
        {
            BinaryHeapPQ <Edge> pq = new BinaryHeapPQ <Edge>();

            for (int v = 0; v < g.V; v++)
            {
                for (int i = 0; i < g.Deg(v); i++)
                {
                    pq.Insert(new Edge()
                    {
                        U = v, V = g.AdjV(v, i), W = g.AdjW(v, i)
                    });
                }
            }
            DisjointSets ds = new DisjointSets(g.V);

            while (pq.Count > 0 && mst.Count < g.V - 1)
            {
                Edge e = pq.ExtractMin();
                int  v = e.U;
                int  w = e.V;
                if (ds.FindSet(v) != ds.FindSet(w))
                {
                    ds.Union(v, w);
                    mst.Add(e);
                }
            }
        }
Пример #2
0
        public Graph Tree(int V)
        {
            if (V == 1)
            {
                return(new Graph(V, new int[][] { }));
            }
            int[] prufer = new int[V - 2];
            for (int i = 0; i < V - 2; i++)
            {
                prufer[i] = random.Next(V);
            }
            int[] degree = new int[V];
            for (int v = 0; v < V; v++)
            {
                degree[v] = 1;
            }
            for (int i = 0; i < V - 2; i++)
            {
                degree[prufer[i]]++;
            }

            BinaryHeapPQ <int> pq = new BinaryHeapPQ <int>();

            for (int v = 0; v < V; v++)
            {
                if (degree[v] == 1)
                {
                    pq.Insert(v);
                }
            }

            List <int[]> edges = new List <int[]>();

            for (int i = 0; i < V - 2; i++)
            {
                int v = pq.ExtractMin();
                edges.Add(new int[] { v, prufer[i], 1 });
                degree[v]--;
                degree[prufer[i]]--;
                if (degree[prufer[i]] == 1)
                {
                    pq.Insert(prufer[i]);
                }
            }
            edges.Add(new int[] { pq.ExtractMin(), pq.ExtractMin(), 1 });

            Graph g = new Graph(V, edges, false);

            return(g);
        }