前段时间在洛谷上碰到了这个,今天刚好离散课上又讲,做个小总结。
一:定义:
1:欧拉路:在一个连通图中存在一条路,经过途中所有边一次且仅一次,这条路叫做欧拉路。
2:欧拉回路:在一个连通图中存在一条路,经过途中所有边一次且仅一次,出发点亦是终点,这样的路是欧拉回路。
二:无向图:
判断法:(以下都是充分必要条件)
1:无向图有一条欧拉路<=>图是连通的,且全部的结点的度是偶数(就是欧拉回路的情况)或只有两个结点的度是奇数。
2:无向图有一条欧拉回路<=>图是连通的,且全部的结点的度是偶数。
代码实现思路:
我们可以设置一个count[]数组,直接遍历所有的边,将遍历到的结点的度数++就行了,最后再进行判断。
三:有向图
判断法:(以下都是充分必要条件)
1:有向图有一条欧拉路<=>当前图是连通的,且只有两个点满足入度!=出度,且这两个点的中,一个结点的入度比出度大1,另一个点的出度比入度大1。其余的点都是出度等于入度。
2:有向图有一条欧拉回路<=>当前图是连通的,且所有的点满足入度==出度。
代码实现思路:
设置两个数组in[] out[]分别记录每一个点的入度出度,然后我们还是直接遍历所有的边就行了。
四:怎样走欧拉回路
你当然可以直接暴力的进行深搜。但是更优的做法是,对于当前的结点,如果我们有很多边可以走,那我们就先跳过割边,实在没有选择了我们再走割边。
五:解决的问题
1:一笔画问题
2:计算机鼓轮问题(挺有意思的一个问题)
等等