题意简述
想象一只 skeleton,抽象其骨头为无向边,关节为顶点,可以得到一个无向连通图。假设定点数为 $J$,该图为 $G$。
这只 skeleton 开始动了起来,我们记录了其在连续 $F$ 帧中的动作,并且建立了一张 spatial-temporal graph。
spatial-temporal graph 是一个有 $F\times J$ 个节点的图。每个节点可以用 $(f, j)$ 唯一表示,前者为其出现的帧,后者为其在 $G$ 中对应的标号。
两点 $(f_1, j_1), (f_2, j_2)$ 间有边,仅当满足以下条件之一:
- $j_1 = j_2, f_1 + 1 = f_2$;
- $f_1 = f_2$,且在 $G$ 中有边 $(j_1, j_2)$。
现在 $G$ 丢失了,只剩下了标号被打乱的 spatial-temporal graph。请还原可能的 $F, J$ 并构造方案。
如有多个方案,请最大化 $F$。
$n\le 10^5, m\le 2\times 10^5$。
主要思路
上面讲了那么多废话,其实题意就是将给定的图看作分层图,每层内部边相同,相邻层只有对应点连边,最大化层数。
设度数最小的点为 $s$,显然其(在某个最优方案)一定是第一层的点。显然,$s$ 的度数不超过 $O(\sqrt{m})$。
枚举 $s$ 在第二层对应的点 $t$。
从 $s,t$ 开始 bfs,则以 $s$ 为起点 bfs 到的点即为第一层的点。
已知第一层的点,就可以确定第二层的点,然后确定所有层的点。
如果过程中出现矛盾,则退出。
最后,检查每一层内部的边是否都相同。
时间复杂度 $O(m\sqrt{m})$。
参考代码
1 |
|