Link
毫无头绪。。 保护着N的必须摧毁,挡着N的可以选择一个摧毁? 有保护关系的必须摧毁,挡着的可以选择一个摧毁? 处理出摧毁某个点的最短时间??取max? 各个点的摧毁是互不影响的?? 先把环去掉??
Solution
性质
限制一个点的最早到达时间的有
- 经过图上的点,消灭掉沿途的各种阻挡它的,然后到达它的时间;
- 保护它的所有点集中,
方法
对这两个量跑Dijstra。每次更新要更新相邻点的最早到达时间,和被保护点的最早不被保护的时间。 每次循环,选择一个没有被保护,且真实时间最小的点来进行松弛。
以下内容纯属一个蒟蒻的自言自语!!求打脸!!
Dijstra算法正确性
设用过的点集为,则需要证明每次选出中最小的那个点的。 假设,那的路径一定是从走到中的一个点,从走到中的点,再从走到。 则一定有。
假如说,还可以被松弛,那到的最短路就是从,到的最短路就不会来源于而是来源于了。
而 又要 这是不可能的。所以。
对于这道题
假设中的点的答案已经最优,且中的点能优化新选出的。那么没被加入一定是因为受到了限制。而限制它的那个点的值都,所以不可能去优化。
总结
Dijstra解决的问题可以明确地划分出阶段来,采用Dijstra的变形必须要满足每次迭代选出的点的答案已经最优。这虽然限制它的灵活性,但有时候也是优势。对于这个题目,因为涉及到最小值中取最大,就必须保证用来更新一个点的最小值的确是最小的,否则如果变小之后,更新也没有意义了。
相反,SPFA在转移的时候不需要保证当前最优,可以用队列来反反复复地修改松弛,所以更加灵活,但就解决不了这种鬼畜的问题了。
关于SPFA的转移作用,参见TA爷的神文
OK。。
不得不说这是一道好题。。
Tips
这类鬼畜的最优化问题怎么想到正解? 寻找限制最优解的量,根据其特点转化成DP/最大流/最小割/最短路之类的。建模能力还在分析问题的能力之后。
Code
1 | //Code by Lucida |