加权无向图-邻接表方式
【理论知识,可以参考这边】
【lua实现】
1 local Edge = {} 2 Edge.__index = Edge 3 4 function Edge.new(v1, v2, w) 5 local obj = {} 6 setmetatable(obj, Edge) 7 8 obj:ctor(v1, v2, w) 9 return obj 10 end 11 12 function Edge:ctor(v1, v2, w) 13 self.v1 = v1 14 self.v2 = v2 15 self.w = w 16 end 17 18 function Edge:GetV1() 19 return self.v1 20 end 21 22 function Edge:GetV2() 23 return self.v2 24 end 25 26 function Edge:GetOther(v) 27 if self.v1 == v then 28 return self.v2 29 end 30 if self.v2 == v then 31 return self.v1 32 end 33 return nil --error 34 end 35 36 function Edge:GetWeight() 37 return self.w 38 end 39 40 function Edge:__eq(b) 41 if self.w ~= b.w then 42 return false 43 end 44 if self.v1 == b.v1 and self.v2 == b.v2 then 45 return true 46 end 47 if self.v1 == b.v2 and self.v2 == b.v1 then 48 return true 49 end 50 return false 51 end
1 local WeightedGraph = {} 2 WeightedGraph.__index = WeightedGraph 3 4 function WeightedGraph.new() 5 local obj = {} 6 setmetatable(obj, WeightedGraph) 7 8 obj:ctor() 9 return obj 10 end 11 12 function WeightedGraph:ctor() 13 self.adjacent = {} 14 self.vertexList = {} 15 self.edgeList = {} 16 end 17 18 function WeightedGraph:GetVertexCount() 19 return #self.vertexList 20 end 21 22 function WeightedGraph:GetVertex(index) 23 return self.vertexList[index] 24 end 25 26 function WeightedGraph:GetEdgeCount() 27 return #self.edgeList 28 end 29 30 function WeightedGraph:AddVertex(v) 31 local list = self.adjacent[v] 32 if nil == list then 33 list = {} 34 self.adjacent[v] = list 35 table.insert(self.vertexList, v) 36 end 37 end 38 39 function WeightedGraph:AddEdge(v1, v2, w) 40 local list1 = self.adjacent[v1] 41 local list2 = self.adjacent[v2] 42 if nil == list1 or nil == list2 then 43 return --顶点不存在 44 end 45 local edge = Edge.new(v1, v2, w) 46 table.insert(list1, edge) 47 table.insert(list2, Edge.new(v2, v1, w)) 48 49 local exists = false 50 for i=1,#self.edgeList do 51 if edge == self.edgeList[i] then 52 break 53 end 54 end 55 if not exists then 56 table.insert(self.edgeList, edge) 57 end 58 end 59 60 function WeightedGraph:GetAdjacent(v) 61 return self.adjacent[v] 62 end 63 64 function WeightedGraph:GetEdges() 65 local list = {} 66 for i=1,#self.edgeList do 67 table.insert(list, self.edgeList[i]) 68 end 69 return list 70 end 71 72 function WeightedGraph:__tostring() 73 print("-----WeightedGraph") 74 for i=1,#self.vertexList do 75 local v = self.vertexList[i] 76 local list = self.adjacent[v] 77 local strBuilder = {} 78 for j=1,#list do 79 local edge = list[j] 80 if j > 1 then 81 table.insert(strBuilder, ",") 82 end 83 table.insert(strBuilder, "(") 84 table.insert(strBuilder, edge:GetOther(v)) 85 table.insert(strBuilder, ":") 86 table.insert(strBuilder, edge:GetWeight()) 87 table.insert(strBuilder, ")") 88 end 89 print(v, "->", table.concat(strBuilder)) 90 end 91 print("-----") 92 end
测试代码:
1 function CreateGraph() 2 local g = WeightedGraph.new() 3 g:AddVertex("0") 4 g:AddVertex("1") 5 g:AddVertex("2") 6 g:AddVertex("3") 7 g:AddVertex("4") 8 g:AddVertex("5") 9 g:AddVertex("6") 10 g:AddVertex("7") 11 12 g:AddEdge("1", "3", 0.29) 13 g:AddEdge("1", "5", 0.32) 14 g:AddEdge("1", "7", 0.19) 15 g:AddEdge("1", "2", 0.36) 16 g:AddEdge("5", "4", 0.35) 17 g:AddEdge("5", "7", 0.28) 18 g:AddEdge("7", "0", 0.16) 19 g:AddEdge("7", "2", 0.34) 20 g:AddEdge("4", "0", 0.38) 21 g:AddEdge("4", "6", 0.93) 22 g:AddEdge("0", "6", 0.58) 23 g:AddEdge("0", "2", 0.26) 24 g:AddEdge("2", "6", 0.4) 25 g:AddEdge("2", "3", 0.17) 26 g:AddEdge("3", "6", 0.52) 27 28 print("v ct: ", g:GetVertexCount()) 29 print("edge ct:", g:GetEdgeCount()) 30 tostring(g) 31 return g 32 end 33 CreateGraph()
得到下面这样一张图: