Пример #1
0
        public void TestMST()
        {
            MST mst = new MST();

            mst.AddEdge(1, 2, 1);
            mst.AddEdge(1, 3, 3);
            mst.AddEdge(1, 4, 4);
            mst.AddEdge(2, 3, 2);
            mst.AddEdge(3, 4, 5);
            mst.Execute();
            Assert.AreEqual(7, mst.Cost);
        }
        // Prim's MST
        public override void GenerateMST()
        {
            Init();

            for (int i = 0; i < graph.Size; i++)
            {
                int v           = FindMinimumDistance();
                var newDistance = distance[v];
                if (newDistance < INFINITY)
                {
                    componentOfMST[v] = true;

                    var v1   = graph.GetVertexByID((uint)v);
                    var v2   = neighbor[v];
                    var edge = new Edge <V, int>(v1, v2);
                    MST.AddEdge(edge);

                    foreach (var w in graph.GetNeighbours(v1))
                    {
                        var e2 = graph.GetEdge(v1, w);
                        if (!componentOfMST[w.ID] && e2.Value < distance[w.ID])
                        {
                            distance[w.ID] = e2.Value;
                            neighbor[w.ID] = v1;
                        }
                    }
                }
                else
                {
                    break;
                }
            }
        }
Пример #3
0
        // Kruskal's MST

        /*
         * 1. Sort edges by decresing weight
         * 2. Pick the first edge with lowest weight
         * 3. Detect cycle
         * 4. Add to graph if not cycle
         */
        public override void GenerateMST()
        {
            var edgeEnum = graph.Edges.OrderBy(e => e.Value);

            foreach (var nextEdge in edgeEnum)
            {
                var isCycle = unionFind.IsCycle((int)nextEdge.Start.ID, (int)nextEdge.End.ID);
                if (!isCycle)
                {
                    MST.AddEdge(nextEdge);
                }
            }
        }
        static void Main(string[] args)
        {
            var    mst = new MST();
            string line;

            using (StreamReader srStreamRdr = new StreamReader(@"edges.txt"))
            {
                while ((line = srStreamRdr.ReadLine()) != null)
                {
                    string[] values = line.Split(new Char[] { ' ' });
                    mst.AddEdge(int.Parse(values[0]), int.Parse(values[1]), int.Parse(values[2]));
                }
            }
            mst.Execute();
            Console.WriteLine(mst.Cost);
            Console.ReadKey();
        }
        // Prim's MST
        public override void GenerateMST()
        {
            Init();

            while (!queue.Empty)
            {
                var e = queue.Dequeue();

                var v = e.Start;
                var w = e.End;
                if (componentOfMST[v.ID] && componentOfMST[w.ID])
                {
                    continue;
                }
                MST.AddEdge(e);
                Visit(v);
                Visit(w);
            }
        }