【CF1481D】AB Graph 题解


原题链接

题意简介

给你一个有向图。图中任意两点间都可以直接往来(含有 n*(n-1) 条边,无重边和自环)。每条边上有一个字母 a 或 b。现要求你找出一条长度为 m 的路径(可重复经过),使路径上的字母构成的字符串为回文串。

思路分析

跟 C 题类似的分类讨论寻找方案。

首先,如果存在同一字母路径构成的环,那么只需要让路径全程都在这个环上就行了。

如果不满足上一条,表明任意两点间的两条有向边的字母不同。那么就有了下面的情形。

  1. m 是 4 的倍数。那么只需要找到一个出边中有两种字母的点(如下图点2),制造出 abba 或 baab 的循环就行了。

    显然,n>2 时必然存在这样的点,不然必会形成同字母环,与“不满足第一条”相矛盾。

  2. m 是奇数。那么随便找两个点走就行了,必然形成 ababa 或是 babab。

  3. m 是 2 的倍数但不是 4 的倍数。找到一个出边有两种字母的点(还是那个点2),然后从与之相连的另一个边开始(如点1),先进行前面的循环,然后(进行中间循环)进入点2,再沿与进入点2的边字母相同的出边到达另一个点(点3),然后在这两个点间进行后面的循环。

由上面的分析我们不难看出,唯一输出 No 的情形是 n=2 、没有同字母环且 m 是偶数的情形。

至于找环,我使用的是dfs序+的写法。

代码库

写得很丑,见谅。

#include 
#include 
#define rep(i,a,b) for(int i=a;i<=b;i++)
inline int min(const int&a,const int&b){
    return a