有向图-邻接表方式
【lua实现】
1 local DGraph = {} 2 DGraph.__index = DGraph 3 4 function DGraph.new() 5 local obj = {} 6 setmetatable(obj, DGraph) 7 8 obj:ctor() 9 return obj 10 end 11 12 function DGraph:ctor() 13 self.adjacent = {} 14 self.edgeCount = 0 15 self.vertexList = {} 16 end 17 18 function DGraph:GetVertexCount() 19 return #self.vertexList 20 end 21 22 function DGraph:GetEdgeCount() 23 return self.edgeCount 24 end 25 26 function DGraph:AddVertex(v) 27 local list = self.adjacent[v] 28 if nil == list then 29 list = {} 30 self.adjacent[v] = list 31 table.insert(self.vertexList, v) 32 else 33 --顶点已存在 34 end 35 end 36 37 function DGraph:AddEdge(v1, v2) 38 local list1 = self.adjacent[v1] 39 local list2 = self.adjacent[v2] 40 if nil == list1 or nil == list2 then 41 return --顶点不存在 42 end 43 table.insert(list1, v2) 44 self.edgeCount = self.edgeCount + 1 45 end 46 47 function Graph:GetAdjacent(v) 48 return self.adjacent[v] 49 end 50 51 function DGraph:__tostring() 52 print("-----DGraph") 53 for i=1,#self.vertexList do 54 local v = self.vertexList[i] 55 local adjList = self.adjacent[v] 56 print(v, "-->", table.concat(adjList, ", ")) 57 end 58 print("-----") 59 end
测试代码:
1 function CreateDGraph() 2 local g = DGraph.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 10 g:AddEdge("0", "2") 11 g:AddEdge("2", "0") 12 g:AddEdge("2", "1") 13 g:AddEdge("2", "3") 14 g:AddEdge("3", "2") 15 g:AddEdge("3", "4") 16 g:AddEdge("3", "5") 17 18 print(g:GetEdgeCount()) 19 print(g:GetVertexCount()) 20 tostring(g) 21 end 22 CreateDGraph()
【参考】
图论算法——有向图的邻接链表实现_日积月累,天道酬勤-CSDN博客_有向图邻接链表