Esempio n. 1
0
        public DijkstraFullReport Dijkstra(int[][] graph)
        {
            int[]  distance       = new int[graph.Length];
            bool[] isShortestPath = new bool[graph.Length];
            int[]  path           = new int[graph.Length];

            var startTime = DateTime.Now;

            for (int i = 0; i < graph.Length; ++i)
            {
                path[0]           = -1;
                distance[i]       = int.MaxValue;
                isShortestPath[i] = false;
            }

            distance[0] = 0;

            for (int count = 0; count < graph.Length - 1; ++count)
            {
                int u = ShortestPath(distance, isShortestPath, graph.Length);
                isShortestPath[u] = true;

                for (int v = 0; v < graph.Length; ++v)
                {
                    if (!isShortestPath[v] && Convert.ToBoolean(graph[u][v]) && distance[u] != int.MaxValue && distance[u] + graph[u][v] < distance[v])
                    {
                        distance[v] = distance[u] + graph[u][v];
                        path[v]     = u;
                    }
                }
            }
            var endTime = DateTime.Now;

            DijkstraFullReport fullReport = new DijkstraFullReport()
            {
                SecondsElapsed      = (endTime - startTime).TotalSeconds,
                MillisecondsElapsed = (endTime - startTime).TotalMilliseconds
            };

            return(SaveDijkstraReport(0, distance, graph.Length, path, fullReport));
        }
Esempio n. 2
0
        private DijkstraFullReport SaveDijkstraReport(int source, int[] distance, int length, int[] path, DijkstraFullReport fullReport)
        {
            List <DijkstraReport> reportList = new List <DijkstraReport>();

            for (int i = 0; i < length; i++)
            {
                DijkstraReport report = new DijkstraReport()
                {
                    Vertex             = i,
                    DistanceFromSource = distance[i],
                    Path = new List <int>()
                };
                report.Path.Add(source);

                GeneratePath(ref report, path, i);

                reportList.Add(report);
            }

            fullReport.Reports = reportList;

            return(fullReport);
        }