Ejemplo n.º 1
0
        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));
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
        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);
        }
Ejemplo n.º 4
0
        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);
        }