예제 #1
0
        public static void MergeGroup(SolvingNode[] cycleRoute)
        {
            var main = cycleRoute.First();

            foreach (var current in cycleRoute)
            {
                if (current == main)
                {
                    continue;
                }

                if (current.State is RefTo refState)
                {
                    if (!cycleRoute.Contains(refState.Node))
                    {
                        throw new InvalidOperationException();
                    }
                }
                else
                {
                    //merge main and current
                    main.State = GetMergedState(main.State, current.State);
                }

                main.Ancestors.AddRange(current.Ancestors);
                current.Ancestors.Clear();

                if (!current.IsSolved)
                {
                    current.State = new RefTo(main);
                }
            }

            var newAncestors = main.Ancestors.Distinct()
                               .SelectMany(r => r.Ancestors)
                               .Where(r => !cycleRoute.Contains(r))
                               .Distinct()
                               .ToList();

            main.Ancestors.Clear();
            main.Ancestors.AddRange(newAncestors);
        }