欧拉路径(欧拉图、半欧拉图)小结

NOIP填坑计划继续。。。

先说说基本概念:
欧拉路径:一条路径在图G中恰好经过每条边一次。

再看看相关概念:
欧拉通路:通过图中所有边的简单路(其实就是每条边经过一次)。
欧拉回路:闭合的欧拉路。
欧拉图:包含欧拉回路的图。
半欧拉图:包含欧拉通路但是不含欧拉回路的图。

接着理解orz(半)欧拉图成立的充要条件:
欧拉图:
无向图G是一个欧拉图当且仅当G连通且所有顶点的度数为偶
有向图G是一个欧拉图当且仅当G连通且所有顶点的出度等于入度
半欧拉图:
无向图G是一个半欧拉图当且仅当G连通,仅有两个点度数为奇,其余所有顶点的度数为偶。(可以这样理解:在一个无向的欧拉图G’上加一条无向边成为半欧拉图G)
有向图G是一个半欧拉图当且仅当G连通,存在点u出度比入度大1,点v出度比入度小1,其余所有顶点的出度等于入度。(可以这样理解:在一个有向的欧拉图G’上加一条有向边成为半欧拉图G)

关于混合图的欧拉回路问题:
1.给G所有无向边定向得到新图G’。
*设每个点i的d[i]表示当前点的出度-入度,如果某个点的d为奇数,则直接退出,欧拉回路不存在
2.建立超级源点S,超级汇点T,对于所有d[i] > 0的i点,连边(S,i,d[i]/2);对于所有d[i] < 0的i点,连边(i,T,d[i]/2);G’所有有向边流量为1,跑一遍最大流。若S引出的所有边满流则将所有被定向的边反向即得一个欧拉图G”,否则原图G不存在欧拉回路。
*例题:poj 1637 代码实现☜

下面的证明用于帮助理解,个人认为不用深究,大概明白能应用即可。
(以下内容修改自kuangbin)
首先给原图中的每条无向边随便指定一个方向(称为初始定向),将原图改为有向图G’,然后的任务就是改变G’中某些边的方向(当然是无向边转化来的,原混合图中的有向边不能动)使其满足每个点的入度等于出度。

设D[i]为G’中(点i的出度 - 点i的入度)。可以发现,在改变G’中边的方向的过程中,任何点的D值的奇偶性都不会发生改变(设将边(i, j)改为(j, i),则i入度加1出度减1,j入度减1出度加1,两者之差加2或减2,奇偶性不变)!而最终要求的是每个点的入度等于出度,即每个点的D值都为0,是偶数,故可得:若初始定向得到的G’中任意一个点的D值是奇数,那么原图中一定不存在欧拉环!

若初始D值都是偶数,则将G’改装成网络:设立源点S和汇点T,对于每个D[i] > 0的点i,连边(S, i),容量为D[i]/2;对于每个D[j]<0的点j,连边(j, T),容量为-D[j]/2;舍弃原有的有向边,所有被定向的边(a,b)的容量为1与原文不同!!!)(表示该边最多只能被改变方向一次)。求这个网络的最大流,若S引出的所有边均满流,则原混合图是欧拉图,将网络中所有流量为1的中间边(就是不与S或T关联的边)在G’中改变方向,形成的新图G”一定是有向欧拉图;若S引出的边中有的没有满流,则原混合图不是欧拉图。

为什么能这样建图?
考虑网络中的一条增广路径S–>i–>…–>j–>T,将这条从i到j的路径在G’中全部反向,则:i的入度加1出度减1,j的入度减1出度加1,路径中其它点的入度出度均不变。而i是和S相连的,因此初始D[i] > 0,即i的出度大于入度,故这样反向之后D[i]减少2;同理,j是和T相连的,这样反向之后D[j]增加2。因此,若最大流中边(S, i)满流(流量为初始D[i]/2),此时D[i]值就变成了0,也就是i的入度等于出度。因此只要使所有S引出的边全部满流,所有初始D值>0的点的D值将等于0,又因为将边变向后所有点的D值之和不变,所有初始D值小于0的点的D值也将等于0,而初始D值等于0的D点既不与S相连也不与T相连,所以它们是网络中的中间点,而中间点的流入量等于流出量,故它们的入度和出度一直不变,即D值一直为0。因此,整个图G’成为欧拉图。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值