static void DijkstraAlgorithm(Dictionary<Node, List<Connection>> graph, Node source)
        {
            PriorityQueue<Node> queue = new PriorityQueue<Node>();

            foreach (var node in graph)
            {
                if (source.ID != node.Key.ID)
                {
                    node.Key.DijkstraDistance = double.PositiveInfinity;
                    queue.Enqueue(node.Key);
                }
            }

            source.DijkstraDistance = 0.0d;
            queue.Enqueue(source);

            while (queue.Count != 0)
            {
                Node currentNode = queue.Peek();

                if (currentNode.DijkstraDistance == double.PositiveInfinity)
                {
                    break;
                }

                foreach (var neighbour in graph[currentNode])
                {
                    double potDistance = currentNode.DijkstraDistance + neighbour.Distance;

                    if (potDistance < neighbour.To.DijkstraDistance)
                    {
                        neighbour.To.DijkstraDistance = potDistance;
                    }
                }

                queue.Dequeue();
            }
        }
        static void Main()
        {
            #region Read Input
            var firstLine = Console.ReadLine();
            var firstLineParts = firstLine.Split(' ');
            var numNodes = int.Parse(firstLineParts[0]);
            var numStreets = int.Parse(firstLineParts[1]);
            var numHospitals = int.Parse(firstLineParts[2]);

            var secondLine = Console.ReadLine();
            var secondLineParts = secondLine.Split(' ');
            bool[] hospitals = new bool[numNodes + 1];
            for (int i = 0; i < numHospitals; i++)
            {
                var currHospital = int.Parse(secondLineParts[i]);
                hospitals[currHospital] = true;
            }

            Dictionary<Node, List<Connection>> graph = new Dictionary<Node, List<Connection>>();
            List<Node> nodes = new List<Node>();

            for (int i = 1; i <= numNodes; i++)
            {
                var node = new Node(i);
                node.DijkstraDistance = int.MaxValue;
                node.IsHospital = hospitals[i];
                nodes.Add(node);
                graph.Add(nodes[i-1], new List<Connection>());
            }

            for (int i = 0; i < numStreets; i++)
            {
                var currConnection = Console.ReadLine().Split(' ');
                var currNode = int.Parse(currConnection[0]);
                var to = int.Parse(currConnection[1]);
                var distance = int.Parse(currConnection[2]);

                graph[nodes[currNode - 1]].Add(new Connection(nodes[to - 1], distance));
                graph[nodes[to- 1]].Add(new Connection(nodes[currNode - 1], distance));
            }
            #endregion;

            #region Get Nearest Hospital
            var hospitalPath = double.PositiveInfinity;
            for (int i = 1; i < hospitals.Length; i++)
            {
                if (hospitals[i])
                {
                    var currPath = 0d;
                    DijkstraAlgorithm(graph, nodes[i-1]);

                    for (int j = 0; j < nodes.Count; j++)
                    {
                        if (!hospitals[j + 1])
                        {
                            currPath += nodes[j].DijkstraDistance;
                        }
                    }

                    if (currPath < hospitalPath)
                    {
                        hospitalPath = currPath;
                    }
                }
            }
            #endregion;

            Console.WriteLine(hospitalPath);
        }
Exemple #3
0
 public Connection(Node To, int distance)
 {
     this.To = To;
     this.Distance = distance;
 }