7.1概念和实现
'''
图抽象数据类型
'''
'''
ADT Graph: #一个图抽象数据类型
Graph(self) #图构造操作,创建一个新图
is_empty(self) #判断是否为一个空图
vertex_num(self) #获得这个图中的顶点个数
edge_num(self) #获得这个图中边的条数
vertices(self) #获得这个图中顶点集合
edges(self) #获得这个图中的边集合
add_vertex(self) #将顶点vertex加入这个图
add_edge(self,v1,v2) #将从v1到v2的边加入这个图
get_edge(self,v1,v2) #获得v1到v2边的有关信息,没有时返回特殊值
out_edges(self,v) #取得从v出发的所有边
degree(self) #检查v的度
'''
'''
图结构的python实现
'''
#邻接矩阵实现
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.copy() #做拷贝
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 ValueError('xxxxxxx')
def add_edge(self,vi,vj,val=1):
if self._invalid(vi) or self._invalid(vj):
raise ValueError(str(vi) + 'or' + str(vj) +'is not a valid vertix')
self._mat[vi][vj] = val
def get_edge(self,vi,vj):
if self._invalid(vi) or self._invalid(vj):
raise ValueError(str(vi) + 'or' + str(vj) +'is not a valid vertix')
return self._mat[vi][vj]
def out_edges(self,vi):
if self._invalid(vi):
raise ValueError(str(vi) +'is not a valid vertix')
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]))
return edges
def __str__(self):
return "[\n "+",\n".join(map(str,self._mat)) + "\n]" + "\nUnconneted: " +str(self._unconn)
'''
import numpy as np
mat = np.random.randint(0,2,(5,5))
graph = Graph(mat,unconn=0)
graph.out_edges(1)
'''
'''
图结构的python实现
'''
#邻接表技术实现
class GraphAL(Graph):
def __init__(self,mat=[],unconn=0):
vnum = len(mat)
for x in mat:
if len(x) != vnum: #检查是否为方阵
raise ValueError("Argument for 'GraphAL'.")
self._mat = [Graph._out_edges(mat[i],unconn) for i in range(vnum)]
self._vnum = vnum
self._unconn = unconn
#增加新顶点时安排一个新编号
def add_vertex(self):
self._mat.append([])
self._vnum +=1
return self._vnum - 1
def add_edge(self,vi,vj,val=1):
if self._vnum == 0:
raise ValueError("Cannot add edge to empty graph.")
if self._invalid(vi) or self._invalid(vj):
raise ValueError(str(vi) + 'or' + str(vj) +'is not a valid vertix')
row = self._mat[vi]
i = 0
while i < len(row):
if row[i][0] == vj:
raise ValueError('该函数不应该有修改边的功能')
if row[i][0] > vj:
break
i +=1
self._mat[vi].insert(i,(vj,val))
def get_edge(self,vi,vj):
if self._invalid(vi) or self._invalid(vj):
raise ValueError(str(vi) + 'or' + str(vj) +'is not a valid vertix')
for i,val in self._mat[vi]:
if i==vj:
return val
return self._unconn
def out_edges(self,vi):
if self._invalid(vi):
raise ValueError(str(vi) +'is not a valid vertix')
return self._mat[vi]
'''
import numpy as np
mat = np.random.randint(0,2,(5,5))
graphal = GraphAL(mat)
graphal.add_edge(2,1)
'''