欧拉路径(回路)Hierholzer算法实现-C语言

文章介绍了Hierholzer算法在寻找有向图的欧拉路径或回路中的应用。该算法通过以边为中心的深度优先搜索,确保所有边都被遍历。首先,计算顶点的入度和出度以判断图是否包含欧拉路径或回路。接着,找到合适的起点,使用DFS遍历图并更新边的状态。最后,通过`find_Euler_Path`函数整合所有步骤,完成欧拉路径的搜索。
  1. 上一篇博文中,我们提到欧拉路径有Hierholzer 和 Fleury 算法,Hierholzer相比而言逻辑清晰,而且比较有效。本文终点介绍Hierholzer的基本算法。Hierholzer算法利用深度优先搜索(DFS),最后完成所有的边的遍历。在图论中,常规的DFS算法的操作对象为顶点,这就导致可能已经完成所有顶点的遍历,但是有些边还没有遍历(比如backedge 或 forward edge类型)。我们以示意为例进行说明,
    在这里插入图片描述
    图中包含12条有向边,注意②->②成为自环有向边(不一定严谨),从顶点①出发,经过顶点③,再经过顶点⑤,而后经过顶点⑥,再遍历顶点②以及顶点④,最后回到顶点⑥,这时候显示全部遍历完成,无需再遍历任何顶点。
    实际情况是,5条白色的边仍然未遍历。如果采用上述方式,那么就无法完成欧拉路径(回路)的遍历过程。
  2. 如何解决上述问题
    要解决上述问题,我们就需要利对边进行标记,以边为对象进行深度优先搜索遍历,这样就可以确保所有的边都可以被遍历到。对于上述顶点,我们可以建立以下属性来跟踪每个顶点对应的边的访问情况,对于每个顶点我们定义in为入度数,定义out为出度数,同时我们跟踪邻接表的访问的顶点指针,用edge_ptr表示。 edge_ptr将被初始化为所有顶点的firstarc(可能为NULL),在每次访问后,向后移动,记录下一个边的指针(edge_ptr->nextarc). 我们可以通过判断edge_ptr是否为空,来确认DFS的访问是否需要结束。
/-------------------------严蔚敏《数据结构》邻接表定义--------------------------/
typedef struct ArcNode
{
   
   
    int              adjvex; //Vertex location this arc points to 本弧所指向的顶点
    struct ArcNode  *nextarc; //Pointer pointing to next Arc 指向下一条弧指针
    InfoType        *info;  //Related information pointer about THIS Arc,该弧相关指针
}ArcNode;

typedef struct VNode
{
   
   
    VertexType  data; //Vertex informaiton
    ArcNode    *firstarc; // First arc incident to this Arc
}VNode,AdjList[MAX_VERTEX_NUM];
/-------------------------严蔚敏《数据结构》邻接表定义------------------------
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值