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); }
private static bool IsCompatible(CycleRecord record) { foreach (var current in currentSubset) { if (!current.IsCompatibleWith(record)) { return(false); } } return(true); }
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); }
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); }