public static IEnumerable <string> GetAllDestinationsByEpsilons(NondeterminedFiniteAutomaton epsilonNfa, string startState) { Queue <int> front = new Queue <int>(); int[] number = new int[epsilonNfa.NumberOfStates]; int[] father = new int[epsilonNfa.NumberOfStates]; for (int i = 0; i < number.Length; i++) { number[i] = 0; father[i] = 0; } int startStateIndex = epsilonNfa.GetStateIndex(startState); number[startStateIndex] = 1; front.Enqueue(startStateIndex); int counterNum = 1; while (front.Count != 0) { int frontHead = front.Dequeue(); var destinationsFrom = epsilonNfa.GetTransitionDestinations(frontHead, 0); foreach (var state in destinationsFrom) { if (number[state] == 0) { front.Enqueue(state); number[state] = ++counterNum; father[state] = frontHead; } } } return(epsilonNfa.GetStates().Where((name) => (number[epsilonNfa.GetStateIndex(name)] > 0))); }