CF36E - Two Paths 题解

如果只选一条路径的话,那就是个欧拉路 / 欧拉回路问题。

考虑两条路径,也就是给定的图一定要是两个欧拉图的并。一个欧拉图可以有 \(0/2\) 个奇点,那么不难得到这个并可以有 \(0/2/4\) 个奇点。对连通性,(注意一定要不考虑孤立点)一个欧拉图必须连通,那么这个并最多有两个连通分量。接下来分类讨论:

  1. 两个连通分量。那么一定是两个各是一个欧拉图就可以了,这个非常简单;

  2. 一个连通分量。

    1. \(0/2\) 个奇点。那么直接求欧拉路就好了,但是注意到 \(L_1,L_2>0\) 这个限制,如果边数为 \(1\) 的话就不可能了,否则可以把最后一条边拆出来;

    2. \(4\) 个奇点。这个是重头戏(对我来说)。那么拆出来的两个并它的欧拉图,一定是各取了这 \(4\) 个中的两个。初步考虑枚举这个分布,对其中一对先找到它们间任意一条路径,方便起见找简单路(一定存在)。那么不难知道,剩下来的一定只有那另两个点是奇点。但是!!连通性不能保证!!!

      这时候不要自闭。我们假设,把这条路径删去后剩下来被拆成若干个连通分量。其中有两个点是奇点,有两种情况,可能是分散在不同连通分量,也有可能在同一个连通分量。但是前者是不可能的!!!有个结论,一个图的奇个数一定是偶数!证明异常简单,每条边会贡献两个度数,于是总度数是偶数,那么所有奇点的度数和也是偶数,那么奇点一定是偶数个。也就是说,拆除来若干个连通分量中一定有一个是包含两个奇点,其它都没有。那么不难想到,对这个连通分量求欧拉路,然后把其它连通分量给嵌到这条简单路中(一定可行,因为无奇点的图的欧拉路起终点(同一个)任意)。

      但是这样做太麻烦了,我写到一半放弃了(小雾)。发现有一种很简单的方法,直接在任意两个奇点之间连虚拟边,然后跑欧拉路,然后再断开。这种以退为进的思想,是我所想不到的了。

实现也需要注意注意。一开始仗着数据范围水就想用 map 存邻接矩阵,但由于重边的存在,反而没有邻接表好写。。。

code

posted @ 2021-03-12 22:42  ycx060617  阅读(71)  评论(0编辑  收藏  举报