有向图-邻接表方式

【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博客_有向图邻接链表

 

posted @ 2022-02-25 21:49  yanghui01  阅读(77)  评论(0编辑  收藏  举报