Advertisement
rg443

Floyd–Warshall algorithm

Jan 6th, 2016
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function Floyd(roads) {
  2.   var M = {};
  3.   for (var i in roads) {
  4.     M[i] = {};
  5.     for (var j in roads) {
  6.       M[i][j] = distance(i, j);
  7.     }
  8.   }
  9.   for (var p in roads) {
  10.     for (var q in roads) {
  11.       for (var r in roads) {
  12.         M[q][r] = Math.min(M[q][r], M[q][p] + M[p][r]);
  13.       }
  14.     }
  15.   }
  16.   return M;
  17. }
  18.  
  19. var roads = {};
  20. function makeRoad(from, to, length) {
  21.   function addRoad(from, to) {
  22.     if (!(from in roads))
  23.       roads[from] = {};
  24.     roads[from][to] = length;
  25.   }
  26.   addRoad(from, to);
  27.   addRoad(to, from);
  28. }
  29.  
  30. function makeRoads(start) {
  31.   for (var i = 1; i < arguments.length; i += 2)
  32.     makeRoad(start, arguments[i], arguments[i + 1]);
  33. }
  34.  
  35. // Direct distance.
  36. function distance(from, to) {
  37.   if (from === to) {
  38.     return 0;
  39.   }
  40.   if (roads[from][to] !== undefined) {
  41.     return roads[from][to];
  42.   }
  43.   return Number.POSITIVE_INFINITY;
  44. }
  45.  
  46.  
  47.  
  48. makeRoads("A", "B", 2, "C", 3);
  49. makeRoads("B", "C", 3, "D", 6);
  50. makeRoads("C", "D", 3, "E", 5);
  51. makeRoads("D", "E", 1, "F", 3);
  52. makeRoads("E", "F", 1);
  53.  
  54.  
  55.  
  56. function init() {
  57.   var s = 'A--2-B--6-D--3-F \n';
  58.   s = s + ' \\   |   /|   / \n';
  59.   s = s + '  3  3  3 1  1   \n';
  60.   s = s + '   \\ | /  | /   \n';
  61.   s = s + '     C--5-E      \n';
  62.   print(s, "pre");
  63. }
  64.  
  65. init();
  66. var res = Floyd(roads);
  67. printLn('Distance A --> F: ' + res.A.F);
  68. printLn('Distance B --> E: ' + res.B.E);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement