【题解】P1477 广义染色 构造 有向图的无向生成树

题目链接

trick1:考虑简单结构上的构造(链、环、相交环、相交链、DAG、基环树、仙人掌、树(外向树、内向树、无向树)等)

考虑一个简单情形:给出的有向图是一个环,若环长为 \(len\) ,那么 \(k\) 合法当且仅当 \(k | len\)

并且我们发现,如果图中的一个任意一个点一定属于一个环,合法的 \(k\) 一定是所有环长的公约数,并且我们随便给一个点染色即可唯一确定所有点的颜色,我们将这种情形的构造称为 “相交环”。

trick2:把有向图的所有边看成无向边构造生成树

考虑将所有的有向边看成无向边,那么对于同一个连通块的两个点 \(a,b\) 我们定义路径上边的权值为 \(1\) 当且仅当边的方向与 “前进方向” 相同,否则边的权值为 \(-1\)

如果一个连通块内,把所有的有向边看成无向边后是树的,那么我们发现任意两点的距离由于是唯一确定的,因此只要我们确定任意一个点的颜色和颜色数,其他点的颜色一定是唯一确定的。

接下来考虑更复杂的情况,如果把所有边看成无向边后有环的情况 —— 即存在至少一对点存在两条简单路径。

考虑如果两点间的路径不唯一确定的情况下,如果两条路径长度分别为 \(len_1,len_2\) ,那么 \(k\) 合法的必要条件为 \(len_1 \equiv len_2(\mod k)\)

移项可得, $len_1 - len_2\equiv 0 (\mod k) $ 即 \(k | (len_1-len_2)\)

并且只要 \(len_1 - len_2 \not = 0\) 那么 \([1,k]\) 一定在路径中循环,那么其等价于一条长度为 \(|len1 - len2|\) 的有向环。

而如果两点间的路径唯一,那么如果确定了路径上的任意一个点,这两点的颜色一定是唯一确定的,那么我们可以将其看成长度为 \(0\) 的有向环。

那么接下来的做法就很自然了:

考虑将所有的边都看成无向边,因为任意一条无向边都可以看成环,因此其相当于一种特殊的 “相交环“ 。

考虑将所有边都看成无向边构造一棵 DFS 树,然后考虑根据边的方向定边权。

\(u\)\(v\) 的祖先,边 \((u,v)\) 边权是 \(1\) 当且仅当有向图存在一条从 u 到 v 的有向边,否则其边权为 \(-1\)

如果不存在非树边,那么显然该连通块的答案为带权直径的长度。

若存在非树边,那意味着存在一条长度非 \(0\) 的有向环,那么颜色数为所有环的环长的 gcd。

那么对应着的建图方法:对于一条有向边 \((u,v)\) 建图时建成无向边(拆成两条有向边) \((u,v,1),(v,u,-1)\)

核心trick:将有向图看成无向图,边的方向看成边权

代码记录

posted @ 2021-08-29 13:33  Themaxmaxmax  阅读(61)  评论(0编辑  收藏  举报