题意
给一张NNN个点,MMM条边的无向图,每个点有点权,问从顶点111到顶点NNN满足经过点的点权不减的路径中,不同点权的数量最多是多少。
分析和错误示范
PS:这题是见过的细节超多的一道题,在看了题解知道思路后,自己实现,还能wa一页,非常离谱,这里主要讲一下我遇到的坑有哪些。
首先题目要求路径上点权不减,很明显可以在建图时只保留点权小到点权大的边,这样随便的路径都能够满足点权不减的要求,难在维护路径上不同点权的数量。
1.TLE做法
很容易想到,可以利用 dpdpdp 的方式来维护,第一个点的 dpdpdp 值为1,然后向与它相邻的点更新 dpdpdp 值,如果相邻的点权值相等,则 dpdpdp 值用原先的更新,否则用原先的 dpdpdp 值+1更新,这样就可以用拓扑排序bfs慢慢跑完更新,就荣获一个TLE。
2.WA做法
赛后忽然想到,我那样bfs会TLE的原因在于没有缩点,而对联通的点权相同的点来说是显然的,因为路径上点权递增,所以对缩完的点来说,如果走出去了,那么就肯定不用再回头,所以这些点只会最多经过一次,当然内部之间可以随便跳,所以可以缩点。
wa1
缩点的方法,我一开始懒得写并查集,就想直接用一个数组记一下映射,第一次出现点权的点当作父节点,然后缩点。
然后wa了2次之后,才想起来我这个毛病犯得很粗暴,那就是我变成在开始读入点权时候就缩点了,其中可能有的点权相同的点并不连通,所以不能缩。所以还是需要使用并查集,那没办法了,改!于是喜提wa2
wa2
使用并查集,并且离线建边,在缩点后重新建边,再次跑拓扑排序,依旧wa。然后发现是我初始化结点1的 dpdpdp 值忘记修改为初始化1号结点的父亲的 dpdpdp 值,所以错了。而且拓扑排序有可能是从其他入度为0的结点开始走,所以还需要其他结点的 dpdp

文章讲述了在处理一个关于无向图的题目时,如何通过优化路径选择、使用缩点和dp方法来解决点权不减路径问题,以及在实现过程中遇到的TLE(时间限制超出)和WA(运行错误)的解决方案和原因分析。
最低0.47元/天 解锁文章
23

被折叠的 条评论
为什么被折叠?



