资源预览内容
第1页 / 共40页
第2页 / 共40页
第3页 / 共40页
第4页 / 共40页
第5页 / 共40页
第6页 / 共40页
第7页 / 共40页
第8页 / 共40页
第9页 / 共40页
第10页 / 共40页
亲,该文档总共40页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
浅谈欧拉路径,5050309760 李冰,欧拉路径和欧拉回路的定义:,一副图,寻找一条只通过每条边一次的路径叫做欧拉路径如果这条路径的起点和终点是同一点,那么这条路径叫做欧拉回路,怎么样判断是否存在欧拉回路,在以下三种情况中有三种不同的算法: 无向图 有向图 混合图 注:前两种的判定很简单,第三种稍复杂一些,但是可转化为前两种的情况(第三种只是简要说明),无向图,每个顶点的入度是偶数,则存在欧拉回路 证明很简单:其原理就是每个顶点要进去多少次,就必须出来多少次如果存在度为奇数的顶点,那么必有通过某一边进入这一点后,没有边可以出去,这样就不会有回路,有向图,每个顶点的入度和出度相等 原理同无向图也是有多少边进入,就要有多少边出去 对于混合图这里就不祥细说明了,混合图,混合图的定义: 有的边是有向的,有的边是无向的。例如城市里的交通网络,有的路是单行道,有的路是双行道。 找到一个给每条无向的边定向的策略,使得每个顶点的入度等于出度,这样就能转换成上面第二种情况。,关于欧拉路径,源点与汇点不为同一点 判定一个图是否有欧拉路径 一个无向图中除源点与汇点的度数为奇数 外,其于点的度数都为偶数,那么则存在欧拉路径,怎么样求欧拉回路,就是循环地找到出发点 一个解决此类问题基本的想法是从某个节点开始,然后查出一个从这个点出发回到这个点的环路径。这种方法保证每个边都被遍历.如果有某个点的边没有被遍历就让这个点为起点,这条边为起始边,把它和当前的环衔接上。这样直至所有的边都被遍历。这样,整个图就被连接到一起了。,具体步骤,如果此时与该点无相连的点,那么就加入路径中 如果该点有相连的点,那么就列一张表,遍历这些点,直到没有相连的点 处理当前的点,删出走过的这条边,并在其相临的点上进行同样的操作并把删除的点加入到路径中去 其实这就是一个递归过程,但选择起点时要注意如果所有点的度数为偶数,那么可以依题意随意选择,都可得到一条欧拉回路 如果有的点度数为奇数,那么先判定是否存在欧拉路径,如果存在,那么起点必须从度数为奇数的点开始,来自上的例子,考虑左边的图,每个点的度都为偶数则存在欧拉路径,来自上的例子,Stack: Location: 1 Circuit:,来自上的例子,Stack: 1 Location: 4 Circuit:,来自上的例子,Stack: 1 4 Location: 2 Circuit:,来自上的例子,Stack: 1 4 2 Location: 5 Circuit:,来自上的例子,Stack: 1 4 2 5 Location: 1 Circuit:,来自上的例子,Stack: 1 4 2 Location: 5 Circuit: 1,来自上的例子,Stack: 1 4 2 5 Location: 6 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 Location: 2 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 2 Location: 7 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 2 7 Location: 3 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 2 7 3 Location: 4 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 2 7 3 4 Location: 6 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 2 7 3 4 6 Location: 7 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 2 7 3 4 6 7 Location: 5 Circuit: 1,来自上的例子,Stack: 1 4 2 5 6 2 7 3 4 6 Location: 7 Circuit: 1 5,来自上的例子,Stack: 1 4 2 5 6 2 7 3 4 Location: 6 Circuit: 1 5 7,来自上的例子,Stack: 1 4 2 5 6 2 7 3 Location: 4 Circuit: 1 5 7 6,来自上的例子,Stack: 1 4 2 5 6 2 7 Location: 3 Circuit: 1 5 7 6 4,来自上的例子,Stack: 1 4 2 5 6 2 Location: 7 Circuit: 1 5 7 6 4 3,来自上的例子,Stack: 1 4 2 5 6 Location: 2 Circuit: 1 5 7 6 4 3 7,来自上的例子,Stack: 1 4 2 5 Location: 6 Circuit: 1 5 7 6 4 3 7 2,来自上的例子,Stack: 1 4 2 Location: 5 Circuit: 1 5 7 6 4 3 7 2 6,来自上的例子,Stack: 1 4 Location: 2 Circuit: 1 5 7 6 4 3 7 2 6 5,来自上的例子,Stack: 1 Location: 4 Circuit: 1 5 7 6 4 3 7 2 6 5 2,来自上的例子,Stack: Location: 1 Circuit: 1 5 7 6 4 3 7 2 6 5 2 4,来自上的例子,Stack: Location: Circuit: 1 5 7 6 4 3 7 2 6 5 2 4 1,伪代码,find_circuit(node i) 如果当前结点没有边 将其加入到路径中 否则:while(node i 没有相连的边) j是与i相临的顶点(即i,j之间有一条边) find_circuit(j); 删除i和j之间的边 将i加入路径中去 ,void solve(int x) if(matchx = 0) RecordRecordPos = x; RecordPos+; else for(int k =0;k=500;k+) if(Arrayxk !=0 ) Arrayxk-; Arraykx-; matchx-; matchk-; solve(k); RecordRecordPos = x; RecordPos+; ,Q & A,
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号