如果只选一条路径的话,那就是个欧拉路 / 欧拉回路问题。
考虑两条路径,也就是给定的图一定要是两个欧拉图的并。一个欧拉图可以有 (0/2) 个奇点,那么不难得到这个并可以有 (0/2/4) 个奇点。对连通性,(注意一定要不考虑孤立点)一个欧拉图必须连通,那么这个并最多有两个连通分量。接下来分类讨论:
-
两个连通分量。那么一定是两个各是一个欧拉图就可以了,这个非常简单;
-
一个连通分量。
-
(0/2) 个奇点。那么直接求欧拉路就好了,但是注意到 (L_1,L_2>0) 这个限制,如果边数为 (1) 的话就不可能了,否则可以把最后一条边拆出来;
-
(4) 个奇点。这个是重头戏(对我来说)。那么拆出来的两个并它的欧拉图,一定是各取了这 (4) 个中的两个。初步考虑枚举这个分布,对其中一对先找到它们间任意一条路径,方便起见找简单路(一定存在)。那么不难知道,剩下来的一定只有那另两个点是奇点。但是!!连通性不能保证!!!
这时候不要自闭。我们假设,把这条路径删去后剩下来被拆成若干个连通分量。其中有两个点是奇点,有两种情况,可能是分散在不同连通分量,也有可能在同一个连通分量。但是前者是不可能的!!!有个结论,一个图的奇个数一定是偶数!证明异常简单,每条边会贡献两个度数,于是总度数是偶数,那么所有奇点的度数和也是偶数,那么奇点一定是偶数个。也就是说,拆除来若干个连通分量中一定有一个是包含两个奇点,其它都没有。那么不难想到,对这个连通分量求欧拉路,然后把其它连通分量给嵌到这条简单路中(一定可行,因为无奇点的图的欧拉路起终点(同一个)任意)。
但是这样做太麻烦了,我写到一半放弃了(小雾)。发现有一种很简单的方法,直接在任意两个奇点之间连虚拟边,然后跑欧拉路,然后再断开。这种以退为进的思想,是我所想不到的了。
-
实现也需要注意注意。一开始仗着数据范围水就想用 map
存邻接矩阵,但由于重边的存在,反而没有邻接表好写。。。