Advertisement
rg443

Dijkstra

Jan 6th, 2016
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function Dijkstra(roads, source, dest) {
  2.   var inf = Number.POSITIVE_INFINITY;
  3.   var distance = {};
  4.   var done = {};
  5.   var pred = {};
  6.   for (var i in roads) {
  7.     distance[i] = inf;
  8.     pred[i] = 0;
  9.     done[i] = false;
  10.   }
  11.   distance[source] = 0;
  12.   for (i in roads) {
  13.     var minDist = inf, closest;
  14.     for (var j in roads) {
  15.       if (!done[j]) {
  16.         if (distance[j] <= minDist) {
  17.           minDist = distance[j];
  18.           closest = j;
  19.         }
  20.       }
  21.     }
  22.     done[closest] = true;
  23.     if (closest === dest) {
  24.       break;
  25.     }
  26.     var neighbors = roadsFrom(closest);
  27.     for (var nb in neighbors) {
  28.       var w = neighbors[nb];
  29.       if (!done[nb]) {
  30.         if (distance[closest] + w < distance[nb]) {
  31.           distance[nb] = distance[closest] + w;
  32.           pred[nb] = closest;
  33.         }
  34.       }
  35.     }
  36.   }
  37.   i = dest;
  38.   if (distance[i] < inf) {
  39.     var thePath = i;
  40.     var place = i;
  41.     while (place !== source) {
  42.       place = pred[place];
  43.       if (place !== source) {
  44.         thePath = place + "->" + thePath;
  45.       }
  46.     }
  47.     thePath = place + "->" + thePath;
  48.     printLn("Distance from " + source + "--\x3e" + dest + " : " + distance[i] + " (" + thePath + ")");
  49.   } else {
  50.     print("no path");
  51.   }
  52. }
  53. var roads = {};
  54. function makeRoad(from, to, length) {
  55.   function addRoad(from, to) {
  56.     if (!(from in roads)) {
  57.       roads[from] = {};
  58.     }
  59.     roads[from][to] = length;
  60.   }
  61.   addRoad(from, to);
  62.   addRoad(to, from);
  63. }
  64. function makeRoads(start) {
  65.   for (var i = 1;i < arguments.length;i += 2) {
  66.     makeRoad(start, arguments[i], arguments[i + 1]);
  67.   }
  68. }
  69. function roadsFrom(place) {
  70.   var found = roads[place];
  71.   if (found === undefined) {
  72.     print("No place named '" + place + "' found.");
  73.   } else {
  74.     return found;
  75.   }
  76. }
  77. makeRoads("A", "B", 2, "C", 3);
  78. makeRoads("B", "C", 3, "D", 6);
  79. makeRoads("C", "D", 3, "E", 5);
  80. makeRoads("D", "E", 1, "F", 3);
  81. makeRoads("E", "F", 1);
  82. function init() {
  83.   var s = "A--2-B--6-D--3-F \n";
  84.   s = s + " \\   |   /|   / \n";
  85.   s = s + "  3  3  3 1  1   \n";
  86.   s = s + "   \\ | /  | /   \n";
  87.   s = s + "     C--5-E      \n";
  88.   print(s, "pre");
  89. }
  90. init();
  91. Dijkstra(roads, "A", "F");
  92. Dijkstra(roads, "E", "B");
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement