public void Case1()
        {
            var vertices = new ExtendedVertex[]
                {
                     new ExtendedVertex(1, new AdjacentEdge[]
                        {
                            new AdjacentEdge(2,1),
                            new AdjacentEdge(3,3),
                            new AdjacentEdge(4,4),
                        }),
                    new ExtendedVertex(2, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,1),
                        new AdjacentEdge(3,2),
                    }),
                    new ExtendedVertex(3, new AdjacentEdge[]
                        {
                            new AdjacentEdge(4,5),
                            new AdjacentEdge(2,2),
                        }),
                    new ExtendedVertex(4, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,4),
                        new AdjacentEdge(3,5),
                    }),
                };

            var primAlg = new PrimMST();
            Assert.AreEqual(7, primAlg.CalcMSTLength(vertices));
        }
        public void Case2()
        {
            var vertices = new ExtendedVertex[]
                {
                    new ExtendedVertex(1, new AdjacentEdge[]
                        {
                            new AdjacentEdge(2,6),
                            new AdjacentEdge(3,3),
                            new AdjacentEdge(4,-14),
                        }),
                    new ExtendedVertex(2, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,6),
                        new AdjacentEdge(4,8),
                    }),
                    new ExtendedVertex(3, new AdjacentEdge[]
                        {
                            new AdjacentEdge(4,12),
                            new AdjacentEdge(1,3),
                        }),
                    new ExtendedVertex(4, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,-14),
                        new AdjacentEdge(3,12),
                        new AdjacentEdge(5,-5),
                    }),
                    new ExtendedVertex(5, new AdjacentEdge[]
                    {
                        new AdjacentEdge(4,-5),
                    }),
                };

            var primAlg = new PrimMST();
            Assert.AreEqual(-10, primAlg.CalcMSTLength(vertices));
        }
示例#3
0
        public decimal CalcMSTLength(ExtendedVertex[] vertices)
        {
            var startVertex = new Random().Next(1, vertices.Length);
            var mst = new HashSet<int> {startVertex};
            decimal mstLength = 0;
            while (mst.Count < vertices.Length)
            {
                //select min edge
                //foreach edge with one vertex in mst and another not select min
                decimal minWeight = decimal.MaxValue;
                int mstVetrexIndex = int.MaxValue;
                foreach (int vertexIndex in mst)
                {
                    foreach (AdjacentEdge edge in vertices[vertexIndex - 1].AdjacentVertices)
                    {
                        if (!mst.Contains(edge.Vertex))
                        {
                            if (edge.Weigth < minWeight)
                            {
                                minWeight = edge.Weigth;
                                mstVetrexIndex = edge.Vertex;
                            }
                        }
                    }
                }

                //add vertex to mst
                mst.Add(mstVetrexIndex);
                // updated mstLength
                mstLength += minWeight;
            }
            return mstLength;
        }
        public void TestCase1()
        {
            var vertices = new ExtendedVertex[]
                {
                    new ExtendedVertex(1, new AdjacentEdge[]
                        {
                            new AdjacentEdge(2,10),
                            new AdjacentEdge(4,30),
                            new AdjacentEdge(5,100),
                        }),
                    new ExtendedVertex(2, new AdjacentEdge[]
                    {
                        new AdjacentEdge(3,50),
                    }),
                    new ExtendedVertex(3, new AdjacentEdge[]
                        {
                            new AdjacentEdge(5,10),
                        }),
                    new ExtendedVertex(4, new AdjacentEdge[]
                    {
                        new AdjacentEdge(3,20),
                        new AdjacentEdge(5,50),
                    }),
                    new ExtendedVertex(5, new AdjacentEdge[0]),
                };

            var alg = new DijkstraAlgorithm(vertices);
            var minPaths = alg.CalculateMinPath();
            Assert.AreEqual(5, minPaths.Length);
            Assert.AreEqual("0,10,50,30,60", string.Join(",", minPaths));
        }
        public void Assignment1_Case1()
        {
            var vertices = new ExtendedVertex[]
                {
                   new ExtendedVertex(1, new AdjacentEdge[]
                        {
                            new AdjacentEdge(2,1),
                            new AdjacentEdge(3,1),
                            new AdjacentEdge(4,2),
                            new AdjacentEdge(5,2),
                            new AdjacentEdge(6,2),
                        }),
                    new ExtendedVertex(2, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,1),
                        new AdjacentEdge(3,1),
                        new AdjacentEdge(4,2),
                        new AdjacentEdge(5,2),
                        new AdjacentEdge(6,2),
                    }),
                    new ExtendedVertex(3, new AdjacentEdge[]
                        {
                            new AdjacentEdge(1,1),
                            new AdjacentEdge(2,1),
                            new AdjacentEdge(4,2),
                            new AdjacentEdge(5,2),
                            new AdjacentEdge(6,2),
                        }),
                    new ExtendedVertex(4, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,2),
                        new AdjacentEdge(2,2),
                        new AdjacentEdge(3,2),
                        new AdjacentEdge(5,2),
                        new AdjacentEdge(6,2),
                    }),
                     new ExtendedVertex(5, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,2),
                        new AdjacentEdge(2,2),
                        new AdjacentEdge(3,2),
                        new AdjacentEdge(4,2),
                        new AdjacentEdge(6,2),
                    }),
                     new ExtendedVertex(6, new AdjacentEdge[]
                    {
                        new AdjacentEdge(1,2),
                        new AdjacentEdge(2,2),
                        new AdjacentEdge(3,2),
                        new AdjacentEdge(4,2),
                        new AdjacentEdge(5,2),
                    }),
                };

            var maxSpaceClustering = new MaxSpaceClustering();
            Assert.AreEqual(2, maxSpaceClustering.CalcMaxSpacing(vertices, 4));
        }
        public int CalcMaxSpacing(ExtendedVertex[] vertices, int clustersCount)
        {
            Array.ForEach(vertices, v =>
            {
                v.Parent = v;
                v.Rank = 0;
            });

            int mergeCount = 0;

            while (mergeCount < vertices.Length - clustersCount)
            {
                var minEdge = GetNextMinEdge(vertices);
                UnionFind.Union(vertices[minEdge.Item1 - 1], vertices[minEdge.Item2 - 1]);
                mergeCount++;
            }

            return CalcMaxSpacing(vertices);
        }
        public void TestCase2()
        {
            var vertices = new ExtendedVertex[]
                {
                    new ExtendedVertex(1, new AdjacentEdge[]
                        {
                            new AdjacentEdge(2,50),
                            new AdjacentEdge(3,10),
                            new AdjacentEdge(5,45),
                        }),
                    new ExtendedVertex(2, new AdjacentEdge[]
                    {
                        new AdjacentEdge(5,10),
                    }),
                    new ExtendedVertex(3, new AdjacentEdge[]
                        {
                            new AdjacentEdge(1,20),
                            new AdjacentEdge(4,15),
                        }),
                    new ExtendedVertex(4, new AdjacentEdge[]
                    {
                        new AdjacentEdge(2,20),
                        new AdjacentEdge(5,35),
                    }),
                    new ExtendedVertex(5, new AdjacentEdge[]
                        {
                            new AdjacentEdge(4,30),
                        }),
                    new ExtendedVertex(6, new AdjacentEdge[]
                        {
                            new AdjacentEdge(4,3),
                        }),
                };

            var alg = new DijkstraAlgorithm(vertices);
            Assert.AreEqual("0,45,10,25,45,1000000", string.Join(",", alg.CalculateMinPath()));
            Assert.AreEqual("1000000,50,1000000,30,0,1000000", string.Join(",", alg.CalculateMinPath(5)));
            Assert.AreEqual("1000000,23,1000000,3,33,0", string.Join(",", alg.CalculateMinPath(6)));
        }
 private static void AddEdge(ExtendedVertex[] vertices, int left, int right, int weight)
 {
     vertices[left - 1].AddAdjacenEdge(new AdjacentEdge(right, weight));
     vertices[right - 1].AddAdjacenEdge(new AdjacentEdge(left, weight));
 }
        private int CalcMaxSpacing(ExtendedVertex[] vertices)
        {
            var minEdge = GetNextMinEdge(vertices);

            return vertices[minEdge.Item1 - 1].AdjacentVertices.Single(x => x.Vertex == minEdge.Item2).Weigth;
        }
 private Tuple<int, int> GetNextMinEdge(ExtendedVertex[] vertices)
 {
     decimal minWeight = decimal.MaxValue;
     Tuple<int, int> nextMinEdge = null;
     foreach (var vertex in vertices)
     {
         foreach (AdjacentEdge edge in vertex.AdjacentVertices)
         {
             if (UnionFind.FindRoot(vertex) != UnionFind.FindRoot(vertices[edge.Vertex - 1]))
             {
                 if (edge.Weigth < minWeight)
                 {
                     minWeight = edge.Weigth;
                     nextMinEdge = new Tuple<int, int>(vertex.Id, edge.Vertex);
                 }
             }
         }
     }
     return nextMinEdge;
 }
 public DijkstraAlgorithm(ExtendedVertex[] vertices )
 {
     _vertices = vertices;
 }