图Graph是比树更为一般的结构,也是由节点和边构成
实际上树是一种具有特殊性质的图
图可以用来表示现实世界中很多事物
道路交通系统、航班线路、互联网连接、或者是 大学中课程的先修次序
一旦我们对图相关问题进行了准确的描述就可以采用处理图的标准算法来解决那些看起来非常困难的问题
# 顶点Vertex类 # Vertex包含了顶点信息,以及顶点连接边 class Vertex: def __init__(self, key): self.id = key self.connectedTo = {} def addNeighbor(self , nbr, weight=0): self.connectedTo[nbr] = weight def __str__(self): return str(self.id) + ' connectedTo: ' \ + str([x.id for x in self.connectedTo]) def getConnections(self): return self.connectedTo.keys() def getId(self): return self.id def getWeight(self,nbr): return self.connectedTo[nbr] # Graph保存了包含所有顶点的主表 class Graph: def __init__(self): self.vertList = {} self.numVertices = 0 def addVertex(self,key): self.numVertices = self.numVertices + 1 newVertex = Vertex(key) self. vertList[key] = newVertex return newVertex def getVertex(self,n): #新增顶点 if n in self.vertList: return self.vertList[n] else: return None def __contains__(self,n): return n in self.vertList def addEdge(self,f,t,cost=0): if f not in self.vertList: nv = self.addVertex(f) # 不存在的顶点先添加 if t not in self.vertList: nv = self.addVertex(t) self.vertList[f].addNeighbor(self.vertList[t], cost) def getVertices(self): return self.vertList.keys() def __iter__(self): return iter(self.vertList.values()) g = Graph() for i in range(6): g.addVertex(i) print(g.vertList) g.addEdge(0,1,5) g.addEdge(0,5,2) g.addEdge(1,2,4) g.addEdge(2,3,9) g.addEdge(3,4,7) g.addEdge(3,5,3) g.addEdge(4,0,1) g.addEdge(5,4,8) g.addEdge(5,2,1) for v in g: for w in v.getConnections(): print("(%s,%s)" % (v.getId(), w.getId()))