static void Main(string[] args) { SubwayMap graph = new SubwayMap(); unDirectedGraph <String> Task1 = new unDirectedGraph <String>(); unDirectedGraph <String> Task2 = new unDirectedGraph <String>(); Task1 = graph.fast(); Task2 = graph.critical(); Console.WriteLine("Task 1: Fastest Route\nVertexA\tVertexB\tColour\n=======================================\n"); Task1.Print(); Console.ReadKey(); Console.WriteLine("Task 2: Articulation Points\nVertexA\tVertexB\tColour\n=======================================\n"); Task2.Print(); Console.ReadKey(); Console.WriteLine("Fastest Route"); Console.WriteLine("Graph: fast"); Task1.Fastest("Node1", "Node4"); Console.ReadKey(); Console.WriteLine("\nGraph: critical"); Task2.Fastest("A", "Z"); Console.ReadKey(); Console.WriteLine("\nArticulation Points\nGraph: fast"); Task1.CriticalStation(); Console.ReadKey(); Console.WriteLine("\nGraph: critical"); Task2.CriticalStation(); Console.ReadKey(); }
// Returns false if at any point of parsing the input from the file error occurs (for example, wrong data or station/command not found) static bool ParseFileAndEvaluate() { // Create an instance of SubwayMap SubwayMap map = new SubwayMap(); // Stores the path to the file string filePath; try { filePath = Directory.GetCurrentDirectory(); } catch (UnauthorizedAccessException) { Console.WriteLine("Cannot access the directory."); return(false); } // Add a file name filePath += "\\input.txt"; // If file doesn't exist, exit method if (!File.Exists(filePath)) { Console.WriteLine("The file does not exist or permission is denied."); return(false); } // Read the file using StreamReader StreamReader reader = new StreamReader(filePath); // Line counter int counter = 1; // If can't get the number of stations, stop reading file if (!Int32.TryParse(reader.ReadLine(), out int numberStations)) { Console.WriteLine("Error on line {0}: Number of stations is not defined.", counter); return(false); } counter++; // Try to read station names for (int index = 0; index < numberStations; index++) { // If can't read the next station's name, stop string name; if ((name = reader.ReadLine()) == null) { Console.WriteLine("Error on line {0}: Not enough stations defined.", counter); return(false); } counter++; // If the station's name contains a space, stop if (name.Contains(" ")) { Console.WriteLine("Error on line {0}: Station's name contains a space, which is not allowed.", counter); return(false); } map.InsertStation(name); } // If can't get the number of links, stop reading file if (!Int32.TryParse(reader.ReadLine(), out int numberLinks)) { Console.WriteLine("Error on line {0}: Number of links is not defined.", counter); return(false); } counter++; // Try to read links for (int index = 0; index < numberLinks; index++) { // If can't read next link, stop string link; if ((link = reader.ReadLine()) == null) { Console.WriteLine("Error on line {0}: Not enough links defined.", counter); return(false); } // If incorrect number of arguments, stop string[] parts = link.Split(' '); if (parts.Length != 3) { Console.WriteLine("Error on line {0}: Link is improperly defined.", counter); return(false); } Color linkColor = GetColor(parts[2]); if (linkColor == Color.None) { Console.WriteLine("Error on line {0}: Link color is incorrect.", counter); return(false); } map.InsertLink(parts[0], parts[1], linkColor); counter++; } // Validate the subway map, i.e. check that the map is connected if (!map.IsConnected()) { Console.WriteLine("Error on line {0}: The resultant map is not connected.", counter); return(false); } // If can't get the number of operations, stop reading file if (!Int32.TryParse(reader.ReadLine(), out int numberOperation)) { Console.WriteLine("Error on line {0}: Number of operations is not defined.", counter); return(false); } counter++; // Try to read operations for (int index = 0; index < numberOperation; index++) { // If can't read next line, stop string operation; if ((operation = reader.ReadLine()) == null) { Console.WriteLine("Error on line {0}: Not enough operations defined.", counter); return(false); } // If incorrect number of arguments, stop string[] parts = operation.Split(' '); switch (parts.Length) { case 1: // The only operation with no arguments is CriticalStations. The operation code is "CS" if (parts[0].ToLower() != "cs") { Console.WriteLine("Error on line {0}: Operation code is incorrect.", counter); return(false); } List <Station> criticalStations = map.CriticalStations(); Console.WriteLine("There are {0} critical stations:", criticalStations.Count); foreach (Station station in criticalStations) { Console.WriteLine(station.Name); } Console.WriteLine(); break; case 3: // The only operation with two arguments is FastestRoute. The operation code is "FR" if (parts[0].ToLower() != "fr") { Console.WriteLine("Error on line {0}: Operation code is incorrect.", counter); return(false); } map.FastestRoute(parts[1], parts[2]); Console.WriteLine(); break; case 4: // The only operation with three arguments is DeleteLink. The operation code is "DL" if (parts[0].ToLower() != "dl") { Console.WriteLine("Error on line {0}: Operation code is incorrect.", counter); return(false); } map.DeleteLink(parts[1], parts[2], GetColor(parts[3])); Console.WriteLine(); // Check if the map is still connected if (!map.IsConnected()) { Console.WriteLine("Error on line {0}: After deletion, map is disconnected.", counter); return(false); } break; default: Console.WriteLine("Error on line {0}: Operation is improperly defined.", counter); return(false); } counter++; } return(true); }