欧拉环游:在图中找到一条路径,从起点开始,依此经过图中的所有边,一个边只能走一次,到达终点,终点和起点可以不同

欧拉回路:在图中找到一条路径,从起点开始,依此经过图中的所有边,最后回到起点,一个边只能走一次。

欧拉环游存在的条件:当前图是连通的,图中的恰有零个或两个顶点的度是奇数,其余顶点的度数为偶数,才会存在

欧拉回路存在的条件:当前图是连通的,图中所有的顶点的度是偶数时,欧拉回路必存在。

寻找欧拉回路的算法:如果从起点出发的所有边均已用完,那么图中就会有的部分遍历不到。最容易补救的方法就是找出有尚未访问的边的路径上的第一个顶点,并执行另外一次深度优先搜索。这将给出另外一个回路,把它拼接到原来的回路上。
继续该过程直到所有的边都被遍历到为止。

用到的数据结构

typedef struct Node* ptrNode;
struct Node {int v;             //记录顶点      ptrNode next;
};
//用链表来存储欧拉回路走过的路径,head为链表的头节点
ptrNode head = (ptrNode)malloc(sizeof(struct Node));
ptrNode H = head;//首先判断图是否为连通的,然后判断图中顶点的度是否都为偶数
int Viseted[MAXVERTEX];         //用一次dfs,记录图是否连通
int degree[MAXVERTEX];          //记录每个顶点的度
int ne;                         //ne记录走过的边
Graph P;                        //邻接矩阵存储图

主函数步骤

int main() {P = BuildGraph();           //初始化图if (IsConnect()) {            //IsConnect 函数判断图是否连通if (Isdegree()) {      //Isdegree 函数判断每个顶点的度是否为偶数printf("存在欧拉回路\n");isDfs(0);            //如果存在欧拉回路,从顶点0开始寻找欧拉回路}else {printf("图中节点的度数不为偶数,欧拉回路不存在\n");}}else {printf("该图不连通,无欧拉回路\n");}return 0;
}

判断图是否连通函数

void dfs(int vertex) {       //对图进行一次dfs,判断图是否连通Viseted[vertex] = 1;for (int i = 0; i < P->Nv; i++) {if (P->Graph[vertex][i] != 0 && Viseted[i] == 0) {dfs(i);}}
}
bool IsConnect() {dfs(0);               //进行一次dfs,然后判断,每个顶点是否都已访问到    for (int i = 0; i < P->Nv; i++) {if (Viseted[i] == 0)        return false;}return true;
}

判断图中顶点度的个数是否为偶数

bool Isdegree() {//判断图中各个顶点的度是否为偶数for (int i = 0; i < P->Nv; i++) {for (int j = 0; j < P->Nv; j++) {if (P->Graph[i][j] != 0) {//i到j有一条边。degree[j]++;}}}for (int i = 0; i < P->Nv;i++) {if (degree[i] % 2 != 0) {return false;}}return true;
}

求欧拉回路函数

void Dfs(int vertex) {//将走过的顶点,加入链表ptrNode p = (ptrNode)malloc(sizeof(struct Node));p->v = vertex;p->next = NULL;H->next = p;H = p;for (int i = 0; i < P->Nv; i++) {if (P->Graph[vertex][i] != 0) {P->Graph[vertex][i] = 0;    //将边删除P->Graph[i][vertex] = 0;  //将边删除ne += 2;                    //统计当前走过的边数Dfs(i);                      break;                      //每个顶点不能往后再走}}
}
void euler(int vertex) {//求欧拉回路路径Dfs(vertex);int flag;ptrNode p,tmp,f=NULL;while (ne < P->Ne * 2) {for (p = head->next; p; p = p->next) {//找出从路径开始的第一个尚未走过边的顶点flag = 0;for (int i = 0; i < P->Nv; i++) {if (P->Graph[p->v][i] != 0) {//顶点p->v有边尚未走过f = H;           //记录当前链表尾的位置    flag = 1;      //找到尚未走过的边的顶点Dfs(p->v);      //p->v进行一次dfsbreak;}}if (flag == 1)break;}//此时f->next为从p->v顶点开始走过的路径//p为链表中要拼接的位置tmp = f;f = f->next->next;//将f拼接到p后面tmp->next = NULL;       //将链表尾置位空H = tmp;              //H为新拼接后的链表尾tmp = p->next;          //保存p->nextp->next = f;      while (p->next)p = p->next;p->next = tmp;            //将tmp接回p->next}//输出欧拉回路for (p = head->next; p;p = p->next) {printf("%d ", p->v);}
}

第九章第十三节(无向图求欧拉回路)相关推荐

  1. 第一章第十三节:循环语句:for循环

    Python基础入门(全套保姆级教程) 第一章 第十三节:循环语句:for循环 字符串是可迭代的 for循环: for 变量 in 可迭代的东西:代码 把可迭代的东西中的每一项内容拿出来. 挨个的赋值 ...

  2. Computer Architectrure: Quantitative Approch 第三章第十三节

    Fallacies and Pitfalls 我们的少数谬误集中在预测性能和能源效率以及从时钟频率或 CPI 等单一指标进行推断的难度上. 我们还表明,对于不同的基准测试,不同的架构方法可能具有完全不 ...

  3. Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名

    参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...

  4. (数据库系统概论|王珊)第九章关系查询处理和关系优化-第三节:查询优化之代数优化

    注意: 关系代数有关符号,大家可能又不熟悉了,点击跳转:(数据库系统概论|王珊)第二章关系数据库-第四节:关系代数 文章目录 一:关系代数表达式等价变换规则 (1)连接.笛卡尔积.并.交的交换律 (2 ...

  5. java第十版基础篇答案第九章_《Java语言程序设计》(基础篇原书第10版)第九章复习题答案...

    第九章 9.1:类为对象定义属性和行为,对象从类创建. 9.2:public class ClassName { } 9.3:ClassName v; 9.4:new ClassName(); 9.5 ...

  6. SRPG游戏开发(三十九)第九章 战斗系统 - 一 战斗属性(Combat Properties)

    返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...

  7. SRPG游戏开发(四十)第九章 战斗系统 - 二 计算战斗数据(Calculate Combat Data)

    返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...

  8. SRPG游戏开发(四十二)第九章 战斗系统 - 四 计算战斗数据II(Calculate Combat Data II)

    返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...

  9. 第九章 思科竞争谋略

    第九章 思科竞争谋略 有 的人经常把自己的成功归结于运气,这种人是很聪明的,正如培根所分析的,这样可以减少别人对自己的嫉妒.在这一点上,培根理解得过于肤浅,对于中等水平的 人来说,可能是这种情况,可是 ...

最新文章

  1. nginx(No such file or directory与invalid PID number)
  2. php delete和truncate,TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。...
  3. 十八、PHP框架Laravel学习笔记——模型的增删改
  4. 使用当前更改创建Git分支
  5. python程序打印出10行的杨辉三角_GitHub 标星 6.5w+,Python 小白 100 天学习计划,从新手到玩转!...
  6. Python检测和防御DOS攻击
  7. java 排班日历,排班日历
  8. 计算机网络培训心得PPT,ppt培训心得体会(精选3篇)
  9. 热腾腾的鸡汤,趁热。
  10. linux修改分区自检,linux tune2fs命令取消大分区开机自检
  11. iOS系统逆向工程之神探侯佩智破量子矩阵
  12. 和弦学习笔记1顺阶和弦
  13. UDS诊断系列介绍08-19服务
  14. KDZD606绝缘服试验装置
  15. Oracle常用命令(一)
  16. 学python的书-学习python求推荐一波书籍?
  17. 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(二)
  18. Windows App开发之开发准备
  19. 计算机考试的雷区,驾照场考技巧与科目三电子路考雷区整理
  20. github学习(1): README.md编辑语法(Github Flavored Markdown)

热门文章

  1. 模式的简史和形而上学
  2. Redis实战—黑马点评项目—优惠券秒杀
  3. Python学习 控制结构综合实训
  4. hutool工具把XML转json bug 解决方案
  5. 移轴镜头摄影计算机作业模板,我来告诉你——后期做出移轴镜头拍摄的效果!...
  6. 问题对语义相似度计算-参赛总结
  7. C语言-输入输出前导显示
  8. 百度CFO王湛生逝世 李彦宏高度评价其贡献
  9. 【Linux】tmpfile 使用介绍
  10. 2010年最值得期待的10款手机客户端