private CheapestFlightModel FindCheapestRoute(string sourceCity, string destinationCity, Graph graph) { var cheapestRouteForEachAirport = new List <CheapestFlightModel>(); var startingNodes = _airportRepository.GetWhere(x => x.City == sourceCity); var destinationNodes = _airportRepository.GetWhere(x => x.City == destinationCity); if (startingNodes.Count() == 0 || destinationNodes.Count() == 0) { throw new NotFoundCityException(); } foreach (var item in startingNodes) { var calculator = new DistanceCalculator(); var graphResults = calculator.CalculateDistances(graph, item.IATA != null ? item.IATA : item.ICAO); var cheapestPerAirport = graphResults .Where(x => destinationNodes.Any(y => x.Key == y.IATA)) .OrderBy(x => x.Distance).FirstOrDefault(); cheapestPerAirport.RouteNames.Add(cheapestPerAirport.Key); cheapestRouteForEachAirport.Add(new CheapestFlightModel { Route = string.Join(" -> ", GetAirportCityNames(cheapestPerAirport.RouteNames.Distinct().ToList())), TotalPrice = cheapestPerAirport.Distance }); } return(FindCheapestRouteOfAllAirports(cheapestRouteForEachAirport)); }
static void Main(string[] args) { Graph graph = new Graph(); //Nodes graph.AddNode("A"); graph.AddNode("B"); graph.AddNode("C"); graph.AddNode("D"); graph.AddNode("E"); graph.AddNode("F"); graph.AddNode("G"); graph.AddNode("H"); graph.AddNode("I"); graph.AddNode("J"); graph.AddNode("Z"); //Connections graph.AddConnection("A", "B", 14, true); graph.AddConnection("A", "C", 10, true); graph.AddConnection("A", "D", 14, true); graph.AddConnection("A", "E", 21, true); graph.AddConnection("B", "C", 9, true); graph.AddConnection("B", "E", 10, true); graph.AddConnection("B", "F", 14, true); graph.AddConnection("C", "D", 9, false); graph.AddConnection("D", "G", 10, false); graph.AddConnection("E", "H", 11, true); graph.AddConnection("F", "C", 10, false); graph.AddConnection("F", "H", 10, true); graph.AddConnection("F", "I", 9, true); graph.AddConnection("G", "F", 8, false); graph.AddConnection("G", "I", 9, true); graph.AddConnection("H", "J", 9, true); graph.AddConnection("I", "J", 10, true); var calculator = new DistanceCalculator(); var distances = calculator.CalculateDistances(graph, "A"); // Start from "G" foreach (var d in distances) { Console.WriteLine("{0}, {1}", d.Key, d.Value); } }
static void Main(string[] args) { var data = Console.ReadLine().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).Select(int.Parse).ToArray(); var nodes = data[0]; var streets = data[1]; var h = data[2]; string[] hospitals = Console.ReadLine().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray(); var graph = new Graph(); for (int i = 0; i < nodes; i++) { graph.AddNode((i + 1).ToString()); } for (int i = 0; i < streets; i++) { var connData = Console.ReadLine().Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries).ToArray(); graph.AddConnection(connData[0], connData[1], int.Parse(connData[2]), true); } var calculator = new DistanceCalculator(); var minSum = double.MaxValue; for (int i = 0; i < hospitals.Length; i++) { var distances = calculator.CalculateDistances(graph, hospitals[i]); var sum = distances.Where(x => hospitals.All(p => p != x.Key)).Sum(x => x.Value); if (sum < minSum) { minSum = sum; } } Console.WriteLine(minSum); }
static void Main() { var reader = new StreamReader("../../input/2.txt"); Console.SetIn(reader); var firstInputLineParams = Console.ReadLine() .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => int.Parse(x)) .ToArray(); var numberOfBuildings = firstInputLineParams[0]; var numberOfStreets = firstInputLineParams[1]; var numberOfHospitals = firstInputLineParams[2]; var hospitals = new HashSet<int>(); var readHospitals = Console.ReadLine() .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => int.Parse(x)); foreach (var h in readHospitals) { hospitals.Add(h); } var graph = new Graph<int>(); var connections = new List<int[]>(); for (int i = 0; i < numberOfStreets; i++) { connections.Add(Console.ReadLine() .Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries) .Select(x => int.Parse(x)) .ToArray()); } // AddNodesToGraph foreach (var connection in connections) { var fromNode = connection[0]; var toNode = connection[1]; var distance = connection[2]; if (!graph.ContainsNode(fromNode)) { graph.AddNode(fromNode); } if (!graph.ContainsNode(toNode)) { graph.AddNode(toNode); } graph.AddConnection(fromNode, toNode, distance, true); } var distanceCalc = new DistanceCalculator<int>(); var minDist = int.MaxValue; foreach (var hospital in hospitals) { var dist = distanceCalc.CalculateDistances(graph, hospital) .Where(x => !hospitals.Contains(x.Key)) .Sum(x => x.Value); if (minDist > dist) { minDist = dist; } } Console.WriteLine(minDist); }