[题解]ABC456E-Endless Holidays

题目链接

https://atcoder.jp/contests/abc456/tasks/abc456_e

题目大意

n个城市,m条无向边,一周有w天,每个城市在一周内有一些日子放假、一些日子工作,可以从任意某个城市出发,每天可以选择留在本城市或者前往相邻城市。问是否存在一个路径让每天去的城市都放假。

核心观察

每次前往的下一个城市必须放假才是合法的,也就是说转移不仅受到道路的限制,还受到日期的限制。所以要把(城市,当前日期)看成整体。也就是状态图。

其实算是分层图建图/状态机建图比较典的题了。

初始状态: (current_city,current_day)
转移条件: next_day=(current_day+1)%w,对于next_city,有连边,且在next_day要放假。

建完图后dfs找环,比较板的解法了,用vis[city][day]保存访问状态,0未访问,1访问过在栈里,2访问过但没有环。

dfs找环

每个节点vis初始化为0,每次dfs检测当前状态,1直接返回true,2直接返回false。0则遍历自身和邻边,若这些点从来没有返回true,则本节点vis设置为2,返回false。

反思

我的找环代码写错了。只设置了0和1,表示访问过和未访问过,dfs退出状态清零,这样就完全是回溯算法,没有剪枝,回到同样的状态会重复搜索。时间复杂度回退到指数级别。于是TLE。
以及分层图/状态机建图还不够熟练,无法一眼识别。

写了一篇训练这类题的识别的随笔:https://www.cnblogs.com/Gusare/p/19967358
和我一样有严重的题目识别困难症可以去试一下

提交后AC代码

https://atcoder.jp/contests/abc456/submissions/75467573

posted @ 2026-05-03 03:19  Gusare  阅读(59)  评论(0)    收藏  举报