[NOI2014]魔法森林

魔法森林

题解

看到这道题应该是很容易想到贪心,我们可以先将所有边根据b值排序,再当前基础上找到所需a值最小的一条路径。

但是由于边会产生改变,于是每次都要跑一遍最短路,明显是会T飞的。

很容易发现,当前加入的一条边只对部分的路径产生影响,而这些路径都是在已有路径的最小生成树上构成一个环的。由于当前到每个点的最优路径都会对以后的答案产生影响,所以我们要实时维护当前最小生成树的形态。

每次加入边时如果这个环上最劣的边比加入的这条边a值更大,就将其删去,再加入当前边。于是我们就需要用LCT来维护这棵最小生成树。

但是于此同时我们如何维护兩(两)点之间连得边呢?我们可以将这些边建成虚点,每次连接就将两个端点连到虚点上,这样就不需要每次更改后都很麻烦的维护点权了,因为每次修改后点的父子关系都是会变的。

这样每次加入边后都维护出当前最优值,答案就是它们中最小的。

时间复杂度

posted @ 2020-09-27 08:24  StaroForgin  阅读(14)  评论(0)    收藏  举报  来源