牛客周赛 Round 54F 出题人题解

大家好,这里是牛客周赛 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 的这份提交。


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

截图
全部评论
F第一个dfs的方法咋证明啊。。。
点赞 回复 分享
发布于 2024-08-08 21:02 河北
分治爆搜的做法,怎么证明每个点只会被搜索一次?例如,在第一次搜索的时候,被之前的路挡住了,回溯之后就没被挡了,再搜一遍,这显然不止搜一次。
点赞 回复 分享
发布于 2024-08-07 09:53 广东

相关推荐

04-17 18:34
中山大学 C++
点赞 评论 收藏
分享
04-16 10:27
已编辑
美团_Saas_后端开发
今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,拿到美团offer那会感觉自己天都亮了。没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
21
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务