第九章第十三节(无向图求欧拉回路)
欧拉环游:在图中找到一条路径,从起点开始,依此经过图中的所有边,一个边只能走一次,到达终点,终点和起点可以不同
欧拉回路:在图中找到一条路径,从起点开始,依此经过图中的所有边,最后回到起点,一个边只能走一次。
欧拉环游存在的条件:当前图是连通的,图中的恰有零个或两个顶点的度是奇数,其余顶点的度数为偶数,才会存在
欧拉回路存在的条件:当前图是连通的,图中所有的顶点的度是偶数时,欧拉回路必存在。
寻找欧拉回路的算法:如果从起点出发的所有边均已用完,那么图中就会有的部分遍历不到。最容易补救的方法就是找出有尚未访问的边的路径上的第一个顶点,并执行另外一次深度优先搜索。这将给出另外一个回路,把它拼接到原来的回路上。
继续该过程直到所有的边都被遍历到为止。
用到的数据结构
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);}
}
第九章第十三节(无向图求欧拉回路)相关推荐
- 第一章第十三节:循环语句:for循环
Python基础入门(全套保姆级教程) 第一章 第十三节:循环语句:for循环 字符串是可迭代的 for循环: for 变量 in 可迭代的东西:代码 把可迭代的东西中的每一项内容拿出来. 挨个的赋值 ...
- Computer Architectrure: Quantitative Approch 第三章第十三节
Fallacies and Pitfalls 我们的少数谬误集中在预测性能和能源效率以及从时钟频率或 CPI 等单一指标进行推断的难度上. 我们还表明,对于不同的基准测试,不同的架构方法可能具有完全不 ...
- Kotlin学习笔记 第二章 类与对象 第十二 十三节 对象表达式与对象声明 类型别名
参考链接 Kotlin官方文档 https://kotlinlang.org/docs/home.html 中文网站 https://www.kotlincn.net/docs/reference/p ...
- (数据库系统概论|王珊)第九章关系查询处理和关系优化-第三节:查询优化之代数优化
注意: 关系代数有关符号,大家可能又不熟悉了,点击跳转:(数据库系统概论|王珊)第二章关系数据库-第四节:关系代数 文章目录 一:关系代数表达式等价变换规则 (1)连接.笛卡尔积.并.交的交换律 (2 ...
- java第十版基础篇答案第九章_《Java语言程序设计》(基础篇原书第10版)第九章复习题答案...
第九章 9.1:类为对象定义属性和行为,对象从类创建. 9.2:public class ClassName { } 9.3:ClassName v; 9.4:new ClassName(); 9.5 ...
- SRPG游戏开发(三十九)第九章 战斗系统 - 一 战斗属性(Combat Properties)
返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...
- SRPG游戏开发(四十)第九章 战斗系统 - 二 计算战斗数据(Calculate Combat Data)
返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...
- SRPG游戏开发(四十二)第九章 战斗系统 - 四 计算战斗数据II(Calculate Combat Data II)
返回总目录 第九章 战斗系统(Combat System) 在SRPG中,大多数情况是指角色与角色之间的战斗.而这种战斗一般有两种模式: 地图中直接战斗: 有专门的战斗场景. 这两种模式的战斗在数据上 ...
- 第九章 思科竞争谋略
第九章 思科竞争谋略 有 的人经常把自己的成功归结于运气,这种人是很聪明的,正如培根所分析的,这样可以减少别人对自己的嫉妒.在这一点上,培根理解得过于肤浅,对于中等水平的 人来说,可能是这种情况,可是 ...
最新文章
- nginx(No such file or directory与invalid PID number)
- php delete和truncate,TRUNCATE 删除表,无法回退。默认选择为整个表的内容,所以不能加条件。...
- 十八、PHP框架Laravel学习笔记——模型的增删改
- 使用当前更改创建Git分支
- python程序打印出10行的杨辉三角_GitHub 标星 6.5w+,Python 小白 100 天学习计划,从新手到玩转!...
- Python检测和防御DOS攻击
- java 排班日历,排班日历
- 计算机网络培训心得PPT,ppt培训心得体会(精选3篇)
- 热腾腾的鸡汤,趁热。
- linux修改分区自检,linux tune2fs命令取消大分区开机自检
- iOS系统逆向工程之神探侯佩智破量子矩阵
- 和弦学习笔记1顺阶和弦
- UDS诊断系列介绍08-19服务
- KDZD606绝缘服试验装置
- Oracle常用命令(一)
- 学python的书-学习python求推荐一波书籍?
- 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(二)
- Windows App开发之开发准备
- 计算机考试的雷区,驾照场考技巧与科目三电子路考雷区整理
- github学习(1): README.md编辑语法(Github Flavored Markdown)