不使用networkx包判断字典是否表示图,现有实现结果异常如何解决
无向图校验函数错误分析与修复
错误核心原因
你的代码存在3个关键逻辑问题,导致不符合预期的校验结果:
- 提前终止校验:只要遍历到第一组合法的邻接对
(x,y)就直接返回True,没有遍历所有节点和所有邻接关系,这是X被误判为合法的核心原因。X中节点1的邻居是0,但0的邻居列表中不存在1,这组非法关系还没被遍历到,函数就已经返回了True。 - 冗余逻辑:代码中的
if y in D[x]完全无效,y本身就是从D[x]中迭代取出的,必然满足该条件,没有判断必要。 - 未覆盖所有节点的自环校验:如果第一个遍历的节点没有自环,但后续节点存在自环,你的代码不会检测到该问题。
修复后的实现
def IsItAGraph(D): # 先校验类型是否为字典 if type(D) is not dict: return False all_nodes = D.keys() for x in all_nodes: # 校验节点是否有自环 if x in D[x]: return False for y in D[x]: # 校验邻居是否为有效节点 if y not in all_nodes: return False # 校验邻接关系是否对称 if x not in D[y]: return False # 所有校验规则都通过才返回True return True G = {0:[1,2], 1:[0], 2:[0]} V = {0:[0,2], 1:[0], 2:[0]} W = {0:[1,2], 1:[4], 2:[0]} X = {0:[2], 1:[0], 2:[0]} Y = [2,3,4] N = [IsItAGraph(Y), IsItAGraph(G), IsItAGraph(V), IsItAGraph(W), IsItAGraph(X)] # 输出结果:[False, True, False, False, False],符合预期
校验逻辑说明
修复后的函数只有在所有节点、所有邻接关系都满足你设定的4条规则后才会返回True,不会提前终止校验,完全覆盖所有判断条件:
- 先判断输入对象是否为字典类型
- 遍历每个节点,检查是否存在自环
- 遍历每个节点的所有邻居,检查邻居是否为有效节点
- 检查邻接关系是否对称(a在b的邻居列表中时,b也必须在a的邻居列表中)
- 所有校验通过才返回
True
内容的提问来源于stack exchange,提问作者Vishal Shahji
相关产品推荐
相关产品推荐

