• 欧拉回路与欧拉路径总结


      笔者在图论挣扎了这么久,今天总算暂时到头了,鉴于欧拉路径和欧拉回路的精妙(e xin)程度,在这里做一个小小的总结。

      首先欧拉绝对是个伟(huai)人,创造了不少东西,其中就包括欧拉路径和欧拉回路这种随便虐死蒟蒻萌新的***

    定义

      欧拉回路:从图上一个点u出发不重复地经过每一条边后,再次回到点u的一条路径。

      欧拉路径:从图上一个点u出发不重复地经过每一条边的一条路径(不必回到点u)。

      欧拉图即存在欧拉回路的图,半欧拉图即存在欧拉路径的图。

      (就像是一笔画,要求每条边只走一次,但每个点可以多次经过,而要求每个点只走一次的模型是哈密顿环。注意欧拉回路必须回到起点,欧拉路径则不必,可以说欧拉回路一定是欧拉路径,反之不成立。)

    定理

      (1)无向图欧拉回路的判定:图G为连通图,所有顶点的度为偶数。

      (2)无向图欧拉路径的判定:图G为连通图,除有2个顶点度为奇数外,其他顶点度都为偶数。

      (3)有向图欧拉回路的判定:图G的①基图联通,所有顶点的入度等于出度。

      (4)有向图欧拉路径的判定:图G的基图联通,存在顶点u的入度比出度小1,v入度比出度大一,其余所有顶点的入度等于出度。(此时u即路径的起点,v即终点)

        ① 忽略有向图所有边的方向,得到的无向图称为该有向图的基图

       “联通”标了红字,当然很重要!有时(实际上是很多时候)给出的原图并不是一个连通图,需小心处理,后面注意事项会提。

    其他定理(非正式定理,但做题时很有用)

      (5)无向图为(半)欧拉图时,只需用1笔画成;无向图为非(半)欧拉图时,即奇点(度为奇数的点)数k>2,需用k/2笔画成。

      (6)可以用加边的方式把一个非欧拉图变成欧拉图。对于无向图来说,每个奇点都需加一个度,加的边为 奇点数/2 ;对于有向图来说,每个点都需加上入度与出度之差,加的边数为每个点入度与出度之差的绝对值之和再除以2。

      笔者在学习(5)(6)定理的时候,曾有过一个疑问:如果要除以2的数是个奇数该怎么办,该向上还是向下取整呢?我承认这是个智障的问题。首先介绍一个定理:一个图的奇点数一定是偶数。证明很简单,可以看看这里:(https://blog.csdn.net/c_lyr/article/details/53082753

      那么对于(5),和(6)的前半条,肯定不会出现奇数除以2;对于(6)的后半条,我们考虑当入度与出度之差是偶数时,不用担心,而当入度与出度之差是奇数时,则入度与出度之和一定是奇数,即这个点是一个奇点,而奇点有偶数个,偶数个奇数相加,结果也是偶数,因此绝不会出现和是奇数的情况。

    求欧拉回路欧拉路径

      用DFS遍历整张图,走过的边标记(如果是无向图,注意同时标记相反方向的边),在DFS返回后把点(也可以是边,看题目要求怎样输出)入栈,最后依次出栈即为路径序列。代码很简单,去网上搜吧,就不贴了(笔者懒)。。。

    注意事项

      求欧拉回路与欧拉路径其实并不是很难的,套模板就行了。难的是那种给一张图统计操作数的题,根据笔者的经验,这种题多半是跟点的入度和出度有关的。当你一脸懵逼不知所措时,不妨从入度和出度入手,灵活运用各种定理分类讨论,往往能找到问题的突破口。还有就是前面提到的,当原图有多个连通块时,需先辨认出每个连通块(并查集或DFS,个人比较喜欢并查集),再分别处理。对于只有一个而没有边的块,一般不用考虑,跳过就行了。

     附上一道还不错的题 https://loj.ac/problem/10111

     至此,我已经介绍了关于欧拉回路和欧拉路径的不少知识(坑点),更多的经验还需在刷题中获得,祝大家AC愉快。

    2018-08-22

    愿你有一天能和重要的人重逢
  • 相关阅读:
    函数库:静态库和动态库
    预处理
    共用体、大端小端的判断、枚举
    结构体内存对齐及大小的判断
    内存的管理方式
    指针的高级应用
    H5+css3属性随笔
    项目实战——仿360囧图
    利用css3的动画实现图片轮播
    了解HTML5大纲算法
  • 原文地址:https://www.cnblogs.com/gosick/p/9518934.html
Copyright © 2020-2023  润新知