文章目录
图的概念
图可以用G=(V,E)来表述,对于图G,V是顶点的集合,E是边的集合。每个边是一个元组(v,w),v和w属于顶点集合V。
- 路径:由边依次连接起来的顶点序列。将路径定义为P=(w1,w2,…,wn) ,其中1<=i<=n-1.无权路径的长度为边的数量,带权路径的长度为所有边的权重之和。
- 圈:有向图里的圈是首尾顶点相同的路径
ADT Graph的实现
顶点Vertex类:包含了顶点信息,以及顶点连接边的信息
- 每一个Vertex使用一个字典来记录顶点与顶点之间的连接关系和每条连接边的权重,这个字典被称作connectionedTo
class Vertex:
def __init__(self, key):
self.id = key
self.connectedTo = {
}
def addNeighbor(self, nbr, weight = 0): #该方法被用来添加从一个顶点到另一个顶点的连接
self.connectedTo[nbr] = weight #nbr是顶点对象的key
def __str__(self):
return str(self.id) + 'connectedTo: ' + str([x.id for x in self.connectedTo])
def getConnections(self): #该方法被用来返回以connectionTo字典中的实例变量所表示的邻接表中的所有顶点
return self.connectedTo.keys()
def getId(self):
return self.id
def getWeight(self, nbr): #该方法通过一个参数返回顶点与顶点之间的边的权重
return self.connectedTo[nbr]
图Graph类:保存了包含所有顶点的主表
- 包含了一个将顶点名称映射到顶点对象的字典,即vertList
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] #通过key查找顶点
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.addVertex:
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())
ADT Grapgh实现代码测试:
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]
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,