private static void Relax(MasterVertex u, MasterVertex v, int weight) { if (v.D > u.D + weight) { v.D = u.D + weight; v.Parent = u; } }
private static void InitializeSingleSource(MasterVertex[] vertices, MasterVertex s) { foreach (MasterVertex v in vertices) { v.D = int.MaxValue; v.Parent = null; } s.D = 0; }
internal void Dijkstra(string fileName) { int source = 0; int n = Math.Min(Math.Max(25, fileName.Length / 2), fileName.Length); l.Text = "running Dijsktra's to find shortest paths from source " + source + " for graph in ..."; l.Text += fileName.Substring(fileName.Length - n, n); statusStrip.Update(); int[][] graph = graphs[fileName]; MasterVertex[] vertices = new MasterVertex[graph.GetLength(0)]; //Source MasterVertex for (int i = 0; i < vertices.Length; i++) { vertices[i] = new MasterVertex() { Name = i.ToString() } } ; InitializeSingleSource(vertices, vertices[source]); List <MasterVertex> result = new List <MasterVertex>(); //adding all MasterVertex to priority queue PriorityQueue <MasterVertex> queue = new PriorityQueue <MasterVertex>(true); for (int i = 0; i < vertices.Length; i++) { queue.Enqueue(vertices[i].D, vertices[i]); } //treversing to all vertices int j = 0; double maxJ = vertices.Length * (double)vertices.Length; while (queue.Count > 0) { var u = queue.Dequeue(); result.Add(u); //again traversing to all vertices for (int v = 0; v < graph[Convert.ToInt32(u.Name)].Length; v++) { p.Value = (int)Math.Round(100 * (j++) / maxJ); if (graph[Convert.ToInt32(u.Name)][v] > 0) { Relax(u, vertices[v], graph[Convert.ToInt32(u.Name)][v]); //updating priority value since distance is changed queue.UpdatePriority(vertices[v], vertices[v].D); } } } p.Value = 0; l.Text = "Ready!"; statusStrip.Update(); ssspSolutions[fileName] = result; }
private static void PrintStringPath(ref String accumulator, MasterVertex u, MasterVertex v, List <MasterVertex> vertices) { if (v != u) { PrintStringPath(ref accumulator, u, v.Parent, vertices); accumulator = accumulator + ", " + v.Name; } else { accumulator = accumulator + v.Name; } }
private static void PrintPath(StreamWriter fileStreamWriter, MasterVertex u, MasterVertex v, List <MasterVertex> vertices) { if (v != u) { PrintPath(fileStreamWriter, u, v.Parent, vertices); fileStreamWriter.Write(", " + v.Name); } else { fileStreamWriter.Write(v.Name); } }