【Learning】 欧拉回路的求解
欧拉回路:
欧拉回路,俗称一笔画,比如一笔画五角星等。
这里给出非严谨的定义:欧拉回路即从一个点出发,不重复、不遗漏地经过所有的边与所有的点,并恰好回到出发点。
包含欧拉回路的图称为欧拉图。
欧拉回路在有向图、无向图和混合图(存在有向边和无向边)上有不同的求法,不过原理上是类似的。
判断方法:
有向图:
研究欧拉回路的性质我们发现:在有向图的欧拉回路中,每一个点,一定是若干次一进一出,否则无解。
因此要求每一个点的入度=出度。
无向图:
类似有向图,在无向图的欧拉回路中,每一个点也是若干次一进一出。
因此要求每一个点的度数为偶数。
混合图:
这下就不好考虑了,我们需要使用网络流建模。我们想办法从出度和入度入手。
首先看每一条有向边$(u,v)$,它们一定会为$u$提供1的出度,为$v$提供$1$的入度。
其次看每一条无向边$(u,v)$,由于其无向,我们暂且随便定一个方向(干脆就$u$->$v$好了),为$u$提供1的出度,为$v$提供1的入度。
现在每个点的出度和入度看起来是乱七八糟的了。我们期望的,是一个点的出度与入度平衡。
由于有向边已经固定,没法改变它们对出入度的贡献,那么现在要做的,是将某一些无向边反向,使得所有点的出入度平衡。
一条边一反向,就会将某一度$-1$,将另一度$+1$。由此如果一个点出入度之差为奇数,那么一定不可能通过无向边的调整使它平衡,此时一定无解。
设一个点$u$的出度为$out$,入度为$in$。
如果$out>in$,那么从这个点出发的边太多。它提供$x=\frac{1}{2}(out-in)$条出边可以反向。这样会给每一条出边的终点的$out+1$,$in-1$。那么由源点$S$向$u$连一条容量为$x$的边。
如果$in>out$,那么到达这个点的边太多。它提供$x=\frac{1}{2}(in-out)$条边可以反向。这样会给每一条入边的起点的$out-1$,$in+1$。那么由$u$向汇点$T$连一条容量为$x$的边。
基于上述关系,$out>in$的点集可以给$in>out$的点集提供边,使得双方都尽可能平衡,即多的给少的。
那么对于原图中每一条无向边$(u,v)$,刚刚定的方向是$u$->$v$才得出当前的度数,那么由$u$向$v$连一条容量为$1$的边就好。
跑最大流,看由$S$出发的边是否全部满流:如果是,则存在欧拉回路;否则不存在欧拉回路。因为这些边满流,代表$out>in$的点已经平衡,可以发现$in>out$的边也恰好平衡了。
如何输出欧拉回路?根据上述建模方法,如果存在欧拉回路,对于中间的点互连的容量为$1$的边,如果流量为0该无向边就这么定向,如果流量为1,所对应的无向边应该要反向。有向边直接输出即可。