混合图的欧拉回路

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/commonc/article/details/52442882

前言:前几天做了一道混合图欧拉回路的题,感觉这个算法比较厉害,学完之后写在这里怕以后忘了

算法目的:求混合图(有的边是单向,有的边是双向)的欧拉回路

预备知识:1.无向图欧拉回路求法
     2.有向图欧拉回路求法
     3.网络流算法
     (其实有向图的欧拉回路相对于无向图来说就相当于再限制一下每个点出度=入度即可,第一个和第三个不会就自己去学吧)

大概思路:先对无向边任意定向,然后根据网络流的自调整功能来验证“能否通过调整将无向边的方向使这个图变成一个具有欧拉回路的图”

算法步骤:1.先对所有无向边进行任意定向,即随机为他们确定一个方向
     2.此时这张图变成了一个有向图,我们计算出所有点的入度和出度,如果有点的入度与出度的奇偶性不同,那么无解
     3.将所有入度>出度的点向超级汇点连一条容量为2的边,超级源点向所有出度>入度的点连一条容量为2的边,然后对于原图中所有的定向为(a,b)无向边连一条从a到b容量为1的边
     4.跑网络流,如果正好能使所有从超级源点出来的边满流,则有解
     5.把在网络流中那些因为原图无向边而建的流量为1的边中经过流量的边反向,就形成了一个能跑出欧拉回路的有向图,如果要求方案,用有向图求欧拉回路的方法求解即可

算法解析:第一步先定向没什么好说的。根据预备知识我们可以得到,只有当所有点的“入度=出度”时,这张图才能有欧拉回路。所以我们的目标是调整“无向边”的方向使得每个点的入度等于出度。
     而考虑我们刚才所进行的网络流建图,从源到汇的一条增广路中经过的那些“原来是无向边而产生的边”,相当于把它们全部进行反向。这样造成的后果就是中间经过的那些点出度入度不变,只有一开始的点入度+1,出度-1、最后的点入度-1,出度+1.所以当源点到一个点的那条边满流时,就意味着这个点的出度已经等于入度了,自调整的过程已经完成。而当全部的点全部完成这一事件时,就说明已经能找到一条欧拉回路了

代码?可以看这里的↓
BZOJ2095: [Poi2010]Bridge题解

没有更多推荐了,返回首页