前言
作为一个别的不行抗伤无敌的 \(\rm{man}\) , 区区反向 \(\rm{rk \ 1}\) 不足为惧
\(\rm{HD0X}\) 巨佬场切 \(2700\) , \(\%\%\%\)
思路
朴素
先把考场上一些基础的想法搬过来
考虑一个环什么时候会导致产生字典序负环, 这个好像还比较显然, 就是如果出去的那个点的字典序小于环上下一个点的字典序, 那就寄了, 怎么处理
枚举每个数作为起点的询问, \(\mathcal{O} (n + m)\) 全部处理出来即可, 这一部分用 \(\rm{dfs}\) 可以解决
那么怎么去考虑字典序负环的问题, 我们发现只要在某一个地方, 字典序最小的选择在环上就寄
我们考虑预处理出那些点可以到达目标点, 然后每次选择只在可以到达的情况下找字典序最小, 如果字典序最小的选择已经被访问过了(即在环上), 那么就无解
正常
这里的正常指符合 \(2700\) 的难度
容易发现枚举起点的做法, 但是这样子不大优, 瓶颈在转移的过程中需要拷贝之前的访问串串
我们也是光速联想到之前的神秘转移倍增, 那么这个题也可以这样做
具体的, 令 \(f_{s, t, i}\) 表示从 \(s \to t\) 的理想路径上的 \(2^i\) 个点, 询问和新插入都是 \(\log\) 的
把 \(f\) 开成 \(\rm{short}\) 类型, 结束
实现
略掉了, 并不难实现, 难得是想
总结
对于一些需要考虑一个点是否在环上的问题, 我们可以 \(\rm{dfs}\) 判断是否已经访问过
对于问题范围比较小时, 可以考虑预处理一些不好实现的东西
倍增作为一种很好的 \(\rm{trick}\) , 多加利用
对于一些有环图, 可能你不需要进行缩点, 因为可以加上判环来解决