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 = unconnself.vnum = vnum1defvertex_num(self):return self.vnumdefadd_edge(self, vi, vj, val =1):assert0<= vi < self.vnum and0<= vj < self.vnumself.mat[vi][vj]= valdefadd_vertex(self):raise AdjGraphError("Adj Matrix does not support 'add_vertex'")defget_edge(self, vi, vj):assert0<= vi < self.vnum and0<= vj < self.vnumreturn self.mat[vi][vj]defout_edges(self, vi):assert0<= vi < self.vnumreturn 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 edgesdef__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 = vnum1self.unconn = unconndefadd_vertex(self):# For new vertex, return an index allocatedself.mat.append([])self.vnum +=1return self.vnumdefadd_edge(self, vi, vj, val =1):assert0<= vi < self.vnum and0<= vj < self.vnumrow = 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:breaki +=1# adjust for the new entry at the endself.mat[vi].insert(i,(vj, val))defget_edge(self, vi, vj):assert0<= vi < self.vnum and0<= vj < self.vnumfor i, val in self.mat[vi]:if i == vj:return valreturn self.unconndefout_edges(self, vi):assert0<= vi < self.vnumreturn self.mat[vi]