大家好,这里是牛客周赛 Round 54的组题人兼A、F出题人。希望大家喜欢清楚姐姐与竹鼠的故事~

根据我出题一题多解的惯例,在这里分享一下F题的两个 std 做法:

分治爆搜

2024.08.25 Update:该做法复杂度理论是错误的,但本题中恰好可以通过,请仔细甄别。感谢 @summ3r 同学的指正。

您好,牛客周赛Round 54的F的分治爆搜做法有误,用下列数据可以卡TLE。但是卡的是搜索方向为上左下右的代码,对于std代码的搜索顺序上左右下受题目限制十分难卡,如果std把queue换成stack或终点不是(n,m)等将会好卡。但无论如何该做法应当也是错误的。

alt

使用到了类似于分治的思想。使用一遍 dfs 搜索出一条可行路径后,对于路径上全部的点入栈、扩展搜索,各自跑 dfs ,如果能到达另一个路径上的点,则将新的这条路径上的全部点入栈、扩展搜索。

该做法细节较多,特别在于回溯部分。最终每个点至多搜索一次,复杂度 ,由于跑了好几次,可能常数稍大。

参考代码

点双/圆方树

对于一个点双中的两点,它们之间简单路径的并集,恰好完全等于这个点双。即同一个点双中的两不同点 之间一定存在一条简单路径经过给定的在同一个点双内的另一点

圆方树模板题,或者连接起点和终点后跑点双缩点,复杂度

参考代码可见 thisislike_fan 的这份提交。


另外,关于为什么一定要使用点双,而边双无法通过,这里提供一个参考样例:

截图