Oops, It's Yesterday Once Twice Three times.
严谨一点讲,这叫广义串并联图方法,即:删一度点,缩二度点,叠合重边。
通俗一点讲,叫:把看上去显然的情况做掉答案就出来了
[USACO22OPEN] Hoof and Brain P
按照套路,先考虑没有出边的点,走到这样的点上面就太蠢了,所以一定不会走过来,因此这样的点可以删掉。
然后考虑有一条出边的点,走到这个点上面只会有一种选择,也就是继续走向唯一的出边对应的点,因此这个点也可以缩掉。也就是说直接让有边指向这个点的点指向出边对应的点。
然后后你缩完之后发现你得到了一张每个点至少有两条出边的图,你发现如果一个点不在已经被删掉的节点,并且两个棋子在新的图上不在同一个节点,那么总有办法不走到另一个棋子所在的节点上,因此Hoof必胜了。
其余情况显然必败,然后就做完了。
「JOI Open 2022」放学路
显然先把最短路径DAG建出来,然后你发现只要路径上逆着走一条DAG上的边,或者走一条不在DAG上的边,那么就可以找到一条路径。
先建个圆方树求出 \(S\) 到 \(T\) 简单路径可能经过的点,然后把DAG缩小成只有这些点的DAG。容易发现如果DAG上有一条多余的边那么显然是可以经过这条边的,因此答案一定存在。
我们只需要考虑原来的边集恰好是这个DAG的情况。考虑没有出度的点,你发现是 \(T\) ,于是不用操作。再考虑只有一条出度且只有一条入度的点,那么无论是正着走还是倒着走路径都是固定的,因此可以缩掉。最后如果 \(S\) 和 \(T\) 直接联通,那么显然不行。否则就显然可以构造出来。
【IOI2022】千岛
先考虑 \(0\) 出度的点,发现走到这个点就是送死,因此可以删掉。
再考虑如果起点只有一个出度,那么肯定是先往前走一步,然后以出度对应的点为新的起点求出答案,然后走回来。如果起点被删了就无解。
因此我们会得到一个图,满足起点至少有两个出度,每个点至少有一个出度。那么我们对于每个非起点的点保留恰好一条边,然后除去起点会得到一个基环树森林。
对于起点我们保留恰好两条出边,然后经过第一条边去那个基环树森林里面绕一圈出来,然后再经过第二条边,然后重复一次把环反过来,就可以得到一条路径。
其余情况显然无解。