Пример #1
0
        public MinimumSpanningTree GetMst()
        {
            var selectedItems = new List<Edge>();

            var source = new MinBinaryHeap<Edge>(_edges);

            var mark = 1;

            while (source.Count > 0)
            {
                var element = source.GetTopElement();
                source.DeleteTopElement();

                if (!CycleFound(selectedItems, element))
                {
                    selectedItems.Add(element);
                    var localMark = mark;
                    var foundEdge = selectedItems.Where(
                        edge =>
                            edge.From.Number == element.From.Number || edge.To.Number == element.From.Number ||
                            edge.From.Number == element.To.Number || edge.To.Number == element.To.Number)
                        .Where(edge => edge.From != element.From && edge.To != element.To)
                        .ToArray();

                    var mrkItems = foundEdge.Where(edge => edge.From.AddedMark > 0).ToArray();
                    if (mrkItems.Any())
                    {
                        localMark = mrkItems.Min(edge => edge.From.AddedMark);
                    }
                    var edges = selectedItems.Where(edge => edge.ContainsPoint(element.From, element.To));
                    foreach (var edge in edges)
                    {
                        edge.State = localMark;
                    }
                    element.State = localMark;
                    mark++;
                }
            }

            return new MinimumSpanningTree(selectedItems.SelectMany(edge => new[] {edge.From, edge.To}).Distinct().ToArray(), selectedItems.Sum(edge => edge.Weight));
        }