序言
$UOJ$果然是神仙$OJ$啊
里面个个都是人才,说话还好听
题目的$hack$数据还可以$hack$掉网上一大片的题解…..
题目描述
为了得到书法大家的真传,小$E$同学下定决心去拜访住在魔法森林中的隐士。魔法森林可以被看成一个包含个$N$节点$M$条边的无向图,节点标号为$1…n$,边标号为$1…m$。初始时小$E$同学在$1$ 号节点,隐士则住在 $n$ 号节点。小$E$需要通过这一片魔法森林,才能够拜访到隐士。
魔法森林中居住了一些妖怪。每当有人经过一条边的时候,这条边上的妖怪就会对其发起攻击。幸运的是,在 $1$ 号节点住着两种守护精灵:$A$型守护精灵与$B$型守护精灵。小$E$可以借助它们的力量,达到自己的目的。
只要小E带上足够多的守护精灵,妖怪们就不会发起攻击了。具体来说,无向图中的每一条边 $e_i$ 包含两个权值 $a_i$ 与 $b_i$。若身上携带的$A$型守护精灵个数不少于 $a_i$,且$B$型守护精灵个数不少于 $b_i$,这条边上的妖怪就不会对通过这条边的人发起攻击。当且仅当通过这片魔法森林的过程中没有任意一条边的妖怪向小$E$发起攻击,他才能成功找到隐士。
由于携带守护精灵是一件非常麻烦的事,小E想要知道,要能够成功拜访到隐士,最少需要携带守护精灵的总个数。守护精灵的总个数为$A$型守护精灵的个数与$B$型守护精灵的个数之和。
题目大意:
从$1$走到$n$,$m$条边,如何走能使$a$和$b$的和最大值最小.
解析
首先,这是一个最小生成树的题目.
其次,这应该是一个动态最小生成树的题目.
(如果你学过用LCT做最小生成树,这个题就非常的水)
我们将$a_i$排序后,按边取,可以保证$a_i$是最小的.
在按$a_i$大小取边的时候,同时更新路上$b_i$的最大值.
当我们取到一个环的时候怎么办?
列如这样:
我们就要对新加入的边上$b_i$的值,和维护的链上$b_i$的最大值进行比较.
- 如果链上的值大,那么我们把链上最大的那条边$cut$,如何把新边连上.
- 如果新边大,我们便直接跳过.
如此往复,直到$1$$n$这条路连通.过了最小生成树的代码居然只有97~~
连通后,我们加入另一个操作:
判断,加入的这条边对于答案的影响.$a$大并不代表$b$也大,因为问的是$a+b$的和.
直到遍历完所有边.
~
1 |
|