zoukankan      html  css  js  c++  java
  • CF36E

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

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

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

    2. 一个连通分量。

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

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

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

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

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

    code

    珍爱生命,远离抄袭!
  • 相关阅读:
    按回车键提交表单
    Access数据库类型及属性
    Problem 1002
    问题 1003
    Problem 1003
    Switch Game(摘自LP学C++)
    1006
    膜拜蛇形矩阵
    A == B?
    Rectangles
  • 原文地址:https://www.cnblogs.com/ycx-akioi/p/solution-cf36e.html
Copyright © 2011-2022 走看看