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)); }
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); }