예제 #1
0
        private static CycleRecord GroupStartingFrom(int start, List <int> BFFs)
        {
            var visited = new bool[BFFs.Count];

            var previous = -1;
            var current  = start;

            visited[current] = true;

            while (!visited[BFFs[current]])
            {
                previous         = current;
                current          = BFFs[current];
                visited[current] = true;
            }

            var openGroup = BFFs[current] == previous;

            if (BFFs[current] != start && !openGroup)
            {
                return(new CycleRecord {
                    isSuccess = false
                });
            }

            var record = new CycleRecord()
            {
                visited   = visited,
                isOpen    = openGroup,
                isSuccess = true,
            };

            return(record);
        }
예제 #2
0
        private static bool IsCompatible(CycleRecord record)
        {
            foreach (var current in currentSubset)
            {
                if (!current.IsCompatibleWith(record))
                {
                    return(false);
                }
            }

            return(true);
        }
예제 #3
0
        public bool IsCompatibleWith(CycleRecord other)
        {
            if (visited.Length != other.visited.Length)
            {
                return(false);
            }

            for (int i = 0; i < visited.Length; i++)
            {
                if (other.visited[i] && visited[i])
                {
                    return(false);
                }
            }
            return(true);
        }
예제 #4
0
        private static int SizeOfLargestCircle(List <int> BFFs)
        {
            var cycleRecords = new CycleRecord[BFFs.Count];

            for (int i = 0; i < BFFs.Count; i++)
            {
                cycleRecords[i] = GroupStartingFrom(i, BFFs);
            }

            var largestClosed = cycleRecords.Where(r => r.isSuccess).Max(r => r.GetSize());

            currentSubset = new List <CycleRecord>();
            var largestOpenCombination = GetLargestCompatibleSubSet(cycleRecords.Where(r => r.isSuccess && r.isOpen).ToList());

            return(largestClosed > largestOpenCombination ? largestClosed : largestOpenCombination);
        }