邻接矩阵类技术咨询:添加邻居查询、邻接判断方法及正确性验证
邻接矩阵类修正与方法实现
原代码问题修正
你的代码存在几处需要调整的问题:
- Python类定义需用小写
class,而非大写Class __init__未初始化顶点数量self.size,导致__len__方法报错add_edge中重复赋值self.adjMatrix[u][v] = 1,遗漏了对称位置self.adjMatrix[v][u] = 1- 未处理顶点索引超出矩阵范围的情况,添加/移除边时可能触发
IndexError - Python3中
print('{:4}'.format(val)),的写法无效,需调整为print('{:4}'.format(val), end='');单独的print需改为print()
完整修正代码+新增方法
下面是修正后的类,同时实现了你需要的两个方法:
get_neighbors(u):返回顶点u的所有邻居列表is_adjacent(u, v):判断顶点u和v是否相邻
class AdjMatrix(): # 初始化矩阵,需指定顶点总数 def __init__(self, size): self.size = size # 创建size×size的零矩阵 self.adjMatrix = [[0 for _ in range(size)] for _ in range(size)] # 添加边 def add_edge(self, u, v): if u == v: print("不能添加顶点到自身的边") return # 校验顶点索引合法性 if u < 0 or u >= self.size or v < 0 or v >= self.size: print("顶点索引超出范围") return self.adjMatrix[u][v] = 1 self.adjMatrix[v][u] = 1 # 移除边 def remove_edge(self, u, v): if u < 0 or u >= self.size or v < 0 or v >= self.size: print("顶点索引超出范围") return if self.adjMatrix[u][v] == 0: print(f"顶点{u}和{v}之间没有边") return self.adjMatrix[u][v] = 0 self.adjMatrix[v][u] = 0 def __len__(self): return self.size # 获取顶点u的邻居列表 def get_neighbors(self, u): if u < 0 or u >= self.size: print("顶点索引超出范围") return [] # 遍历u对应的行,收集所有值为1的列索引(即邻居) neighbors = [] for v in range(self.size): if self.adjMatrix[u][v] == 1: neighbors.append(v) return neighbors # 判断两个顶点是否相邻 def is_adjacent(self, u, v): if u < 0 or u >= self.size or v < 0 or v >= self.size: print("顶点索引超出范围") return False # 邻接矩阵中1代表存在边,0代表不存在 return self.adjMatrix[u][v] == 1 # 打印矩阵 def print_matrix(self): for row in self.adjMatrix: for val in row: print('{:4}'.format(val), end='') print()
方法说明
- get_neighbors(u):
- 先校验顶点u的合法性,避免索引错误
- 遍历顶点u对应的行,将所有值为1的列索引收集为邻居列表返回
- is_adjacent(u, v):
- 先校验两个顶点的合法性
- 直接返回邻接矩阵中
adjMatrix[u][v]是否为1,即可判断是否相邻
使用示例
# 创建包含5个顶点的邻接矩阵 graph = AdjMatrix(5) graph.add_edge(0, 1) graph.add_edge(0, 2) graph.add_edge(1, 3) print("邻接矩阵:") graph.print_matrix() print("\n顶点0的邻居:", graph.get_neighbors(0)) print("顶点1和3是否相邻:", graph.is_adjacent(1, 3)) print("顶点0和3是否相邻:", graph.is_adjacent(0, 3))
输出结果:
邻接矩阵: 0 1 1 0 0 1 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0 顶点0的邻居: [1, 2] 顶点1和3是否相邻: True 顶点0和3是否相邻: False
内容的提问来源于stack exchange,提问作者Vincent Yang
相关产品推荐
相关产品推荐

