infinity =float("inf")classAdjGraphError(TypeError):passclassGraph:# basic graph class, using adjacent matrixdef__init__(self, mat, unconn =0):
vnum1 =len(mat)for x in mat:iflen(x)!= vnum1:# Check square matrixraise ValueError("Argument for 'GraphA' is bad.")
self.mat =[mat[i][:]for i inrange(vnum1)]
self.unconn = unconn
self.vnum = vnum1
defvertex_num(self):return self.vnum
defadd_edge(self, vi, vj, val =1):assert0<= vi < self.vnum and0<= vj < self.vnum
self.mat[vi][vj]= val
defadd_vertex(self):raise AdjGraphError("Adj Matrix does not support 'add_vertex'")defget_edge(self, vi, vj):assert0<= vi < self.vnum and0<= vj < self.vnum
return self.mat[vi][vj]defout_edges(self, vi):assert0<= vi < self.vnum
return self._out_edges(self.mat, vi, self.unconn)
@staticmethoddef_out_edges(mat, vi, unconn):
edges =[]
row = mat[vi]for i inrange(len(row)):if row[i]!= unconn:
edges.append((i, row[i]))return edges
def__str__(self):return"[\n"+"\n".join(map(str, self.mat))+"\n]"\
+"\nUnconnected: "+str(infinity)
2、采取邻接表方式
classGraphA(Graph):def__init__(self, mat, unconn =0):
vnum1 =len(mat)for x in mat:iflen(x)!= vnum1:# Check square matrixraise ValueError("Argument for 'GraphA' is bad.")
self.mat =[Graph._out_edges(mat, i, unconn)for i inrange(vnum1)]
self.vnum = vnum1
self.unconn = unconn
defadd_vertex(self):# For new vertex, return an index allocated
self.mat.append([])
self.vnum +=1return self.vnum
defadd_edge(self, vi, vj, val =1):assert0<= vi < self.vnum and0<= vj < self.vnum
row = self.mat[vi]for i inrange(len(row)):if row[i][0]== vj:# replace a value for mat[vi][vj]
self.mat[vi][i]=(vj, val)returnif row[i][0]> vj:break
i +=1# adjust for the new entry at the end
self.mat[vi].insert(i,(vj, val))defget_edge(self, vi, vj):assert0<= vi < self.vnum and0<= vj < self.vnum
for i, val in self.mat[vi]:if i == vj:return val
return self.unconn
defout_edges(self, vi):assert0<= vi < self.vnum
return self.mat[vi]