inf = float("inf") # inf的值大于任何float类型的值
class GraphError(ValueError):
pass
邻接矩阵实现
class Graph:
def __init__(self, mat, unconn=0):
vnum = len(mat)
for x in mat:
if len(x) != vnum: # 检查是否为方阵
raise ValueError("Argument for 'Graph' . ")
self._mat = [mat[i][:] for i in range(vnum)] # 做拷贝
self._unconn = unconn
self._vnum = vnum
def vertex_num(self):
return self._vnum
def _invalid(self, v):
return 0 > v or v >= self._vnum
def add_vertex(self):
raise GraphError( \
"Adj-Matrix dose not support 'add_vertex' . ")
def add_edge(self, vi, vj, val=1):
if self._invalid(vi) or self._invalid(vj):
raise GraphError(str(vi) + 'or' + str(vj) + /
" is not a valid verdex. ")
self._mat[vi][vj] = val
def get_edge(self, vi, vj):
if self._invalid(vi) or self._invalid(vj):
raise GraphError(str(vi) + 'or' + str(vj) + /
" is not a valid verdex. ")
return self._mat[vi][vj]
def out_edges(self, vi): # 获得从v出发的所有边
raise GraphError( \
"Adj-Matrix dose not support 'add_vertex' . ")
return self._out_edges(self._mat[vi], self._unconn)
@staticmethod
def _out_edges(row, unconn):
edges = []
for i in range(len(row)):
if row[i] != unconn:
edges.append((i, row[i]))