加权有向图-邻接表方式

【理论知识,可以参考这边】

图论算法——加权有向图的数据结构_日积月累,天道酬勤-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()

 

posted @ 2022-03-08 22:56  yanghui01  阅读(89)  评论(0编辑  收藏  举报