You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Python类实现图及有向图欧拉路径判断的技术求助

思路提示:Graph类定位与有向图欧拉路径判定实现

一、先理清Graph类的定位

完全可以把这个Graph类理解为课程里定义的图 ( G=(V,E) ),对应关系非常直接:

  • self._vertice:存储的是Vertex实例的列表,对应顶点集 ( V );self._vkeys是顶点唯一标识的集合,用来避免重复添加同一个顶点。
  • self._edges:存储的是Edge实例的列表,对应边集 ( E );self._ekeys是边的唯一标识(两个顶点key的元组)集合,用来避免重复添加同一条边。

简单来说,Vertex是单个顶点的封装(key是它的唯一ID,比如示例里的v1,value是顶点的附加数据),Edge是单条边的封装(key=(k1,k2)代表从顶点k1到k2的边,value是边的权重或其他数据),而Graph就是把这些顶点和边组织起来的容器,对应课程里的完整图结构。

二、DiGraph类euler方法的实现思路

要判断有向图是否存在欧拉路径,核心是先回忆有向图欧拉路径的判定规则,再拆分步骤实现:

1. 先明确判定规则

有向图存在欧拉路径的充要条件是:

  • 条件1:图是弱连通的(忽略边的方向后,所有有边关联的顶点构成的子图是连通的;如果有孤立顶点,不影响判定,因为欧拉路径只要求遍历所有边)
  • 条件2:顶点的入度、出度满足以下两种情况之一:
    • 所有顶点的入度等于出度(此时存在欧拉回路,属于欧拉路径的特殊情况)
    • 恰好有一个顶点的出度比入度大1(作为欧拉路径的起点),恰好有一个顶点的入度比出度大1(作为终点),其余所有顶点的入度等于出度

2. 拆分实现步骤

步骤1:完善基础图操作(先给Graph/DiGraph加必要方法)

当前的Graph只有get方法,没有添加顶点和边的接口,你需要先实现:

  • add_vertex(self, key, value=0):检查key是否在_vkeys中,不在的话创建Vertex实例(给它的key赋值为传入的标识,比如v1),加入_vertice和_vkeys。
  • add_edge(self, k1, k2, value=0):先验证k1和k2都在_vkeys中,然后创建Edge实例,加入_edges和_ekeys;如果是DiGraph(建议继承Graph),这里还要维护每个顶点的入度和出度——比如给Vertex类添加in_degree和out_degree属性,添加边时k1的out_degree +=1,k2的in_degree +=1。

步骤2:实现弱连通性检查

可以用DFS或BFS来实现:

  • 先收集所有有边关联的顶点(或者直接用所有顶点,如果要求整个图连通)
  • 选一个起始顶点(如果顶点非空),用DFS/BFS遍历,记录访问过的顶点
  • 最后检查:所有有边的顶点是否都被访问到(如果有孤立顶点,它们不影响欧拉路径的存在)

步骤3:统计入度和出度,验证条件2

  • 遍历所有顶点,收集每个顶点的入度和出度数据
  • 统计:入度≠出度的顶点数量,以及它们的入度出度差值
    • 如果所有顶点入度=出度 → 符合条件
    • 如果恰好有两个顶点入度≠出度,其中一个出度-入度=1,另一个入度-出度=1 → 符合条件
    • 其他情况 → 不符合

步骤4:整合逻辑到euler方法

把上述两个条件的检查结果结合起来:如果弱连通性满足,且入度出度条件满足,返回True,否则返回False。

3. 小提示

  • 如果不想修改Vertex类的属性,也可以在DiGraph中用字典来存储入度和出度,比如self._in_degree = defaultdict(int),self._out_degree = defaultdict(int),添加边时更新这两个字典。
  • 连通性检查时,要注意处理空图的情况(没有顶点或没有边的情况,根据题目要求判定是否存在欧拉路径)。

内容的提问来源于stack exchange,提问作者WinnyDaPoo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:52:14