加权无向图-邻接表方式

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

加权无向图的数据结构

 

【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()

 

得到下面这样一张图:

 

posted @ 2022-02-25 22:19  yanghui01  阅读(74)  评论(0编辑  收藏  举报