public IList <string> Run(string[,] input) { var tickets = input; var flightList = new List <FlightPair>(); for (int i = 0; i < input.GetLength(0); i++) { flightList.Add(new FlightPair(input[i, 0], input[i, 1])); } flightList.Sort(); var airportMap = new Dictionary <string, FlightMap>(); foreach (var pair in flightList) { if (!airportMap.ContainsKey(pair.Departure)) { airportMap.Add(pair.Departure, new FlightMap(pair.Departure)); } if (!airportMap.ContainsKey(pair.Destination)) { airportMap.Add(pair.Destination, new FlightMap(pair.Destination)); } var departures = airportMap[pair.Departure].GetNoNextNodes(); if (departures.Count == 0) { var departure = new FlightNode(pair.Departure); airportMap[pair.Departure].AddNode(departure); departures.Add(departure); } var destinations = airportMap[pair.Destination].GetNoPrevNodes(); if (destinations.Count == 0) { var destination = new FlightNode(pair.Destination); airportMap[pair.Destination].AddNode(destination); destinations.Add(destination); } var valid = false; foreach (var departure in departures) { if (valid) { continue; } foreach (var destination in destinations) { if (valid) { continue; } departure.Next = destination; destination.Prev = departure; var hasLoop = TestForLoop(departure); if (hasLoop) { departure.Next = null; destination.Prev = null; } else { valid = true; } } } } var sampleNode = airportMap[input[0, 0]].Nodes[0]; while (sampleNode.HasPrev()) { sampleNode = sampleNode.Prev; } var resultList = new List <string>(); while (sampleNode != null) { resultList.Add(sampleNode.Name); sampleNode = sampleNode.Next; } return(resultList); }