public static List <Node> Dijkstra(Graph graph, Dictionary <Edge, double> weights, Node start, Node end) { var notVisited = graph.Nodes.ToList(); var track = new Dictionary <Node, DijkstraData>(); track[start] = new DijkstraData { Price = 0, Previous = null }; while (true) { Node toOpen = null; var bestPrice = double.PositiveInfinity; foreach (var e in notVisited) { if (track.ContainsKey(e) && track[e].Price < bestPrice) { bestPrice = track[e].Price; toOpen = e; } } if (toOpen == null) { return(null); } if (toOpen == end) { break; } foreach (var e in toOpen.IncidentEdges.Where(z => z.From == toOpen)) { var currentPrice = track[toOpen].Price + weights[e]; var nextNode = e.OtherNode(toOpen); if (!track.ContainsKey(nextNode) || track[nextNode].Price > currentPrice) { track[nextNode] = new DijkstraData { Previous = toOpen, Price = currentPrice }; } } notVisited.Remove(toOpen); } var result = new List <Node>(); while (end != null) { result.Add(end); end = track[end].Previous; } result.Reverse(); return(result); }
public List <Node> Dijkstra(Node start, Node end) { // не посещённые вершины var notVisited = graph.Nodes.ToList(); // словарь, вершина и ее Dijkstradata var track = new Dictionary <Node, DijkstraData>(); // инициализация первой вершины track[start] = new DijkstraData { Price = 0, Previous = null }; while (true) { // вершина, которую будем "открывать" Node toOpen = null; // наименьшая цена var bestPrice = double.PositiveInfinity; // выбираем вершину из не посещённых с наименьшей ценой foreach (var e in notVisited) { if (track.ContainsKey(e) && track[e].Price < bestPrice) { bestPrice = track[e].Price; toOpen = e; } } if (toOpen == null) { return(null); } if (toOpen == end) { break; } foreach (var e in toOpen.IncidentEdges.Where(z => z.From == toOpen)) { var currentPrice = track[toOpen].Price + weights[e]; var nextNode = e.OtherNode(toOpen); if (!track.ContainsKey(nextNode) || track[nextNode].Price > currentPrice) { track[nextNode] = new DijkstraData { Previous = toOpen, Price = currentPrice }; } } notVisited.Remove(toOpen); } var result = new List <Node>(); while (end != null) { result.Add(end); end = track[end].Previous; } result.Reverse(); return(result); }