欧拉回路

来源:互联网 发布:讲课软件 编辑:程序博客网 时间:2024/05/21 17:05

其实感觉这个东西还是挺基础的,然而我还是不太清楚它是什么。。。

欧拉路径:图G中的一条路径恰通过G中每条边一次。
欧拉回路:若一条欧拉路径最后回到起点,则称为欧拉回路。
半欧拉图:存在欧拉路径但不存在欧拉回路的图。
欧拉图:存在欧拉回路的图。

定理:
1.若无向图G为欧拉图,当且仅当G为连通图且G中所有点的度(出度和入度的和)为偶数。
推论:若无向图G为半欧拉图,当且仅当G为连通图且G除了两个顶点外,其余所有点的度为偶数。

2.若有向图G为欧拉图,当且仅当G的基图(有向图的所有有向边都变为无向边)为连通图且G中所有点的入度等于出度
推论:若有向图G为半欧拉图,当且仅当G的基图为连通图且存在点u的出度比入度大1,点v的出度比入度小1

【根据这两个性质可以判断一个有向/无向图是否存在欧拉回路/欧拉路径】

3.混合图欧拉回路
网络流

方法:
1;把无向边随便定向,计算每个点的入度和出度。如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路。
2;构造网络流模型:
1.有向边无法变向,删之。
2.上面的1中我们已经将无向图变为有向图了,对这个图建图,容量上限为1。
3.另新建s,t,
若u的出度>入度,连接(s,u) 容量为(u的出度-u的入度)/2;
若u的出度<入度,连接(u,t) 容量为(u的入度-u的出度)/2;
4.查看是否有满流(最大流==所有流向汇点的流量)的分配 有就是有欧拉回路,没有则是没有。

原理:
当我们在步骤1后,就得到了一些点,出入度之差为偶数,而我们知道 当每个点入度=出度的时候,就存在欧拉回路,所以我们就需要将x=出入度之差/2条变反向就能得到这个点入度=出度。
问题就变成了如何找到这些需要反向的边。
跑完网络流后,查看流值分配,将所有流量非 0(上限是1,流值不是0就是1)的边反向。
因为连接s的点出度大于入度,而这些出的边满流了,所以我们将它反向一下就入度=出度了,对于与t相连的边同理。对于没有和s,t相连的点,它们本来就保持了出入度相等,所以就无所谓啦。

混合图欧拉路径
先上述方法判断是否存在欧拉回路,如果存在就肯定有欧拉路径。
如果欧拉回路不存在,枚举欧拉路径的起点和终点,中间连一条无向边,然后再用上述方法判断是否存在欧拉回路即可。

【基础个p麻烦死了】

应用:
1。一笔画问题
2。欧拉发现这个回路的那个桥的问题(实在记不到叫啥名字)

很少的例题:
欧拉路径判断:
有向图 POJ 1386
混合图 POJ 1647

欧拉路径输出解 POJ 2230