加权有向图-邻接表方式
【理论知识,可以参考这边】
图论算法——加权有向图的数据结构_日积月累,天道酬勤-CSDN博客_加权有向图
【lua实现】
1 local WeightedDGraph = {} 2 WeightedDGraph.__index = WeightedDGraph 3 4 function WeightedDGraph.new() 5 local obj = {} 6 setmetatable(obj, WeightedDGraph) 7 8 obj:ctor() 9 return obj 10 end 11 12 function WeightedDGraph:ctor() 13 self.adjacent = {} 14 self.vertexList = {} 15 self.edgeCount = 0 16 end 17 18 function WeightedDGraph:GetVertexCount() 19 return #self.vertexList 20 end 21 22 function WeightedDGraph:GetVertex(index) 23 return self.vertexList[index] 24 end 25 26 function WeightedDGraph:GetEdgeCount() 27 return self.edgeCount 28 end 29 30 function WeightedDGraph: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 WeightedDGraph: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 table.insert(list1, {v = v2, w = w}) 46 self.edgeCount = self.edgeCount + 1 47 end 48 49 function WeightedDGraph:GetAdjacent(v) 50 return self.adjacent[v] 51 end 52 53 function WeightedDGraph:__tostring() 54 print("-----WeightedDGraph") 55 for i=1,#self.vertexList do 56 local v = self.vertexList[i] 57 local list = self.adjacent[v] 58 local strBuilder = {} 59 for j=1,#list do 60 local adjVInfo = list[j] 61 if j > 1 then 62 table.insert(strBuilder, ",") 63 end 64 table.insert(strBuilder, "(") 65 table.insert(strBuilder, adjVInfo.v) 66 table.insert(strBuilder, ":") 67 table.insert(strBuilder, adjVInfo.w) 68 table.insert(strBuilder, ")") 69 end 70 print(v, "->", table.concat(strBuilder)) 71 end 72 print("-----") 73 end
测试代码:
1 function CreateGraph() 2 local g = WeightedDGraph.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("0", "2", 0.26) 13 g:AddEdge("0", "4", 0.38) 14 g:AddEdge("1", "3", 0.29) 15 g:AddEdge("2", "7", 0.34) 16 g:AddEdge("3", "6", 0.52) 17 g:AddEdge("4", "7", 0.37) 18 g:AddEdge("4", "5", 0.35) 19 g:AddEdge("5", "1", 0.32) 20 g:AddEdge("5", "4", 0.35) 21 g:AddEdge("5", "7", 0.28) 22 g:AddEdge("6", "0", 0.58) 23 g:AddEdge("6", "2", 0.4) 24 g:AddEdge("6", "4", 0.93) 25 g:AddEdge("7", "3", 0.39) 26 g:AddEdge("7", "5", 0.28) 27 28 print("v ct: ", g:GetVertexCount()) 29 print("edge ct:", g:GetEdgeCount()) 30 tostring(g) 31 return g 32 end 33 CreateGraph()