弗罗莱(Fleury)算法 欧拉(Euler)通路/回路
1、基本概念:
(1)欧拉图的基本概念:
欧拉通路 (欧拉迹):通过图中每条边一次且仅一次,并且过每一顶点的通路。
欧拉回路 (欧拉闭迹):通过图中每条边一次且仅一次,并且过每一顶点的回路。
欧拉图:存在欧拉回路的图。欧拉图就是从一顶点出发每条边恰通过一次又能回到出发顶点的那种图,即不重复的行遍所有的边再回到出发点。
通路和回路:称vie1e2…envj为一条从 vi到 vj且长度为n的通路,其中长度是指通路中边的条数.称起点和终点相同的通路为一条回路。
简单图:不含平行边和自回路的图。
混合图:既有有向边,也有无向边的图
平凡图:仅有一个结点的图
完全图:有n个结点的且每对结点都有边相连的无向简单图,称为无向完全图;有n个结点的且每对结点之间都有两条方向相反的边相连的有向简单图为有向完全图。
(2)欧拉图的特征:
无向图
a)G有欧拉通路的充分必要条件为:G 连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。
b)G有欧拉回路(G为欧拉图):G连通,G中均为偶度顶点。
有向图
a)D有欧拉通路:D连通,除两个顶点外,其余顶点的入度均等于出度,这两个特殊的顶点中,一个顶点的入度比出度大1,另一个顶点的入度比出度小1。
b)D有欧拉回路(D为欧拉图):D连通,D中所有顶点的入度等于出度。一个有向图是欧拉图,当且仅当该图所有顶点度数都是0。
2 、弗罗莱(Fleury )算法思想-解决欧拉回路
Fleury算法:
任取v0∈V(G),令P0=v0;
设Pi=v0e1v1e2…ei vi已经行遍,按下面方法从中选取ei+1:
(a)ei+1与vi相关联;
(b)除非无别的边可供行遍,否则ei+1不应该为Gi=G-{e1,e2, …, ei}中的桥(所谓桥是一条删除后使连通图不再连通的边);
(c)当(b)不能再进行时,算法停止。
可以证明,当算法停止时所得的简单回路Wm=v0e1v1e2….emvm(vm=v0)为G中的一条欧拉回路,复杂度为O(e*e)。
3 、欧拉算法C 语言描述
void DFS(Graph &G,SqStack &S,int x,int t)
{k=0;//一个标志,来标记当前访问的节点是否还有邻接边可供访问Push(S,x); //将本次遍历边所经由的点入栈for(i=t;i<v;i++) //v是顶点数,e是边数if(G[i][x]>0) {k=1;G[i][x]=0; G[x][i]=0; //此边已访问,删除此边DFS(G,S,i,0);//寻找下一条关联的边,本次找到的是与x关联的i,在//下一层中将寻找与i关联的边break;}//if,forif(k==0) //如果k=0,说明与当前顶点关联的边已穷尽{Pop(S);GetTop(S,m);G[x][m]=1;G[m][x]=1;//恢复在上一层中被删除的边a=x+1;//如果可能的话,从当前节点的下一条关联边开始搜寻if(StackLength(S)!=e)//继续搜寻,边还没有全部遍历完{Pop(S); //还原到上一步去DFS(G,S,m,a);//}//ifelse //搜寻完毕,将最后节点也入栈Push(S,x);}//if
}//DFSvoid Euler(Graph &G,int x)
{
//G是存储图的邻接矩阵,都处理成无向图形式,值为1代表有边,0代表无边,不包括自回路,x是出发点
InitStack(S);//用来存放遍历边时依次走过的顶点
DFS(G,S,x,0);//深度优先遍历查找,0是指查询的起点
//输出while(!StackEmpty(S)){GetTop(S,m);printf("->v%d",m);Pop(S);}//while
}//Euler</span>
如下为算法的图示动态过程:
4、欧拉算法的C实现
#include "SqStack.h" //堆栈的常见操作
#include "Queue.h"//队列的常见操作typedef int Graph[200][200];
int v,e;void DFS(Graph &G,SqStack &S,int x,int t)
{int k=0,i,m,a;Push(S,x);for(i=t;i<v;i++)if(G[i][x]>0){k=1;G[i][x]=0; //删除此边G[x][i]=0;DFS(G,S,i,0);break;}//if,forif(k==0){Pop(S);GetTop(S,m);G[x][m]=1;//恢复刚刚删除的边G[m][x]=1;a=x+1;//从下一条边开始搜寻if(StackLength(S)!=e){Pop(S);DFS(G,S,m,a);}//ifelsePush(S,x);}//if
}//DFSint BFSTest(Graph G)
{int a[200],x,i,k=0;LinkQueue Q;InitQueue(Q);EnQueue(Q,0);for(i=0;i<v;i++)a[i]=0;a[0]=1;while(!QueueEmpty(Q)){DeQueue(Q,x);for(i=0;i<v;i++)if(G[x][i]>0)if(a[i]!=1){a[i]=1;EnQueue(Q,i);}//if}//whilefor(i=0;i<v;i++)if(a[i]==0){k=1;break;}if(k==1)return 0;elsereturn 1;
}void Euler(Graph &G,int x)
{int m;SqStack S;InitStack(S);DFS(G,S,x,0);printf("该图的一个欧拉回路为:");while(!StackEmpty(S)){GetTop(S,m);printf("->v%d",m);Pop(S);}//while
}void InputM1(Graph &G)
{int h,z;
printf("Please input 顶点数和边数\n");
scanf("%d",&v);
scanf("%d",&e);
for(int i=0;i<v;i++)for(int j=0;j<v;j++)G[i][j]=0;printf("please int the 邻接矩阵的值(起点(数字) 终点(数字)):\n");
for(int i=0;i<e;i++){scanf("%d",&h);scanf("%d",&z);G[h-1][z-1]=1;G[z-1][h-1]=1;}//for
}//InputM1int main()
{int i,j,sum,k=0;Graph G;InputM1(G);if(BFSTest(G)==0){printf("该图不是连通图!\n");exit(0);}//iffor(i=0;i<v;i++){sum=0;for(j=0;j<v;j++)sum+=G[i][j];if(sum%2==1){ k=1;break;}//if}//forif(k==1) printf("该图不存在欧拉回路!\n");elseEuler(G,0); //从那个点出发
return 1;
}
顶点数5,边数为6
相关联的点1 21 32 54 23 24 5
5、小常识:欧拉算法的起由及一笔画问题
七桥问题:18世纪著名古典数学问题之一。在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来(如图)。问是否可能从这四块陆地中任一块出发,恰好通过每座桥一次,再回到起点?欧拉于1736年研究并解决了此问题,他把问题归结为如下右图的“一笔画”问题,证明上述走法是不可能的。
一笔划:
⒈凡是由偶点组成的连通图,一定可以一笔画成。画时可以把任一偶点为起点,最后一定能以这个点为终点画完此图。
⒉凡是只有两个奇点的连通图(其余都为偶点),一定可以一笔画成。画时必须把一个奇点为起点,另一个奇点终点。
⒊其他情况的图都不能一笔画出。(奇点数除以二便可算出此图需几笔画成。)
弗罗莱(Fleury)算法 欧拉(Euler)通路/回路相关推荐
- 算法 {欧拉函数,欧拉定理,费马小定理}
欧拉函数 定义 ϕ ( x ) , x ∈ N + \phi(x), \ \ x \in N^+ ϕ(x), x∈N+ means the number of y ∈ N + y \in N^+ y ...
- rsa算法欧拉函数c语言,三、欧拉函数
请思考以下问题: 任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?) 计算这个值的方法就叫做欧拉函数,以φ(n)表示.在1到 ...
- fleury求欧拉环游算法 matlab,Fleury算法求欧拉路径
分析: 小Ho:这种简单的谜题就交给我吧! 小Hi:真的没问题么? <10分钟过去> 小Ho:啊啊啊啊啊!搞不定啊!!!骨牌数量一多就乱了. 小Hi:哎,我就知道你会遇到问题. 小Ho:小 ...
- 欧拉(Euler)定理
Euler定理 设P为满足下列条件的多面体: ( a ) P 的 任 何 两 个 顶 点 可 以 用 一 串 棱 相 连 接 : \lparen{a}\rparen\ P的任何两个顶点可以用一串棱相连 ...
- python求解欧拉Euler公式
题干
- 隐形Euler方法的java程序_常微分方程的解法 (二): 欧拉(Euler)方法
上一节讲了 常微分方程的三种离散化 方法:差商近似导数.数值积分.Taylor 多项式近似. 目录 §2 欧拉(Euler)方法 2.1 向前 Euler 公式.向后 Euler 公式 ...
- Euler-Maruyama discretization(欧拉-丸山数值解法)
欧拉法的来源 在数学和计算机科学中,欧拉方法(Euler method)命名自它的发明者莱昂哈德·欧拉,是一种一阶数值方法,用以对给定初值的常微分方程(即初值问题)求解.它是一种解决常微分方程数值积分 ...
- 信创操作系统Linux(Bclinux、龙蜥、欧拉、Rocky、Alma)
BC-Linux8.6大云企业操作系统 BC-Linux操作系统是中国移动自主研发.基于openAnolis龙蜥社区,通过定制化手段研发的企业级 Linux 操作系统,在系统的性能.稳定性.关键工具和 ...
- 三维CAD建模 基于Brep的扫成与欧拉操作
基于B-rep的建模操作及其算法 欧拉操作 基于B-rep的建模操作及其算法 上了高老师的cad课,高老师的课十几年来不变的大作业就是基于半边结构的5个欧拉操作和sweep扫成cad模型的实现,以下是 ...
最新文章
- Nginx其他配置——日志管理、网页压缩、访问控制
- 负载均衡(SLB)使用最佳实践
- Java提升篇——equals()方法和“==”运算符
- 线程:CountDownLatch同步工具
- qpaint 在graphicsview上的qimage画一条线_solidworks2016画一个塑料外壳:用开放的草图进行切除,你会吗?...
- 00003-回文数的判定-leetcode-解法不唯一,1.reverse最简单,2.数学方法很有意思
- 卡耐基梅隆计算机学院,卡内基梅隆计算机学院--计算机系简介
- 基于SSM的校园帮系统
- sun服务器如何查cpu信息,solaris 如何查看CPU信息
- git 添加远程服务器,远程搭建git服务器新手踩坑
- 扫描仪显示没有服务器,扫描仪安装好了,点击显示寻找扫描仪怎么显示未找出扫描仪...
- 华为外包的感受(CSDN)
- mac php fpm.pid,php-fpm的常用配置和优化
- 微信小程序的购物车功能
- z-index什么意思
- MQTT:QoS服务质量 0,1,2(Quality of Service 0, 1 2)
- ★「C++游戏」BattleOfPhantom:大乱斗游戏升级版
- 唯物辩证法-马克思主义辩证法
- 使用python连接clickhouse并发送邮件
- IntelliJ IDEA中JAVA连接MySQL数据库