MST.lua 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. -- ================
  2. -- Private helpers
  3. -- ================
  4. local setmetatable = setmetatable
  5. local Graph = require("Graph/Graph")
  6. local Node = require("Graph/Node")
  7. require("func")
  8. local MST = {
  9. _VERSION = "0"
  10. }
  11. function xor(a, b)
  12. return (a and not b) or (b and not a)
  13. end
  14. -- cost = function taking an edge as argument and returning its cost
  15. function MST.search(g, cost)
  16. local res = Graph({g.vertices[1]}, {})
  17. for k,v in pairs(g.vertices) do
  18. end
  19. local nb_vertices = 1
  20. while nb_vertices < #(g.vertices) do
  21. local edges_not_in_res = filter(function(e)
  22. if res:contains_edge(e) then
  23. return false
  24. end
  25. return true
  26. end, g.edges)
  27. for _,e in pairs(edges_not_in_res) do
  28. end
  29. local edges_exiting_res = filter(function (e)
  30. local in_graph = 0
  31. for _,v in pairs(res.vertices) do
  32. if v.id == e.p1.id then
  33. in_graph = in_graph + 1
  34. end
  35. if v.id == e.p2.id then
  36. in_graph = in_graph + 1
  37. end
  38. end
  39. if in_graph == 1 then return true end
  40. return false
  41. end, edges_not_in_res)
  42. local min = nil
  43. local selected_edge = nil
  44. for _,e in pairs(edges_exiting_res) do
  45. c = cost(e)
  46. if min == nil or min > c then
  47. min = c
  48. selected_edge = e
  49. end
  50. end
  51. if not res:contains_vertex(selected_edge.p1) then
  52. res:append_vertex(selected_edge.p1)
  53. nb_vertices = nb_vertices + 1
  54. end
  55. if not res:contains_vertex(selected_edge.p2) then
  56. res:append_vertex(selected_edge.p2)
  57. nb_vertices = nb_vertices + 1
  58. end
  59. if not res:contains_edge(selected_edge) then
  60. res:append_edge(selected_edge)
  61. end
  62. end
  63. for k,v in pairs(res.vertices) do
  64. end
  65. return res
  66. end
  67. return MST