把博客园图标替换成自己的图标
把博客园图标替换成自己的图标end

题解 P5234 [JSOI2012] 越狱老虎桥

洛谷

题意

有一个 $n$ 个节点,$m$ 条边的图,还有一条不确定的边,问最劣情况下的桥的权值最小值(极其省流版)。若这个图强联通则输出 $-1$。

分析

其实这个省流版题意就带了一定的分析了,要使有一个电网没有通电,那么必然需要使其变成两个联通块,那么我们删除的这条边也就一定是一条桥了。

首先要做的就是缩点,在处理这一类的题目时,先思考缩点后的树的情况可以节省很多没有必要的思考,可以给我们提供整个方向。

接下来我们就要思考我们这条不确定的边的影响,因为我们的答案是最劣情况下的桥的权值最小值,因此,我们从最小的边开始,假如这条边不能被这一条边保护,那这条边就是答案。

我们分析这一条边能保护的对象,他与原来的那棵树连成了一个环,这一条环上的我们都能保护。(令这一条边两端为 $U$,$V$)。

也就是说,我们枚举的这一条边的两边 $u$、$v$($u$ 为 $v$ 的父亲),$U$ 与 $V$ 中必然有一个节点是 $v$ 子树下的,而另一个,必然不可以是。考虑在 $dfn$ 序上,就可以使 $U$,与 $V$ 约束在一个范围内,最后就可以解决了。

sort(edge+1,edge+cnt+1);
for(int i=1; i<=cnt; ++i) {
    int u=edge[i].u,v=edge[i].v,w=edge[i].w;
    if(fa[v][0]!=u) swap(u,v);
    if(dfn[v]<=L1&&R1<=R[v]&&dfn[v]<=L2&&R2<=R[v]) print(w);
    if(dfn[v]<=L1&&R1<=R[v]) continue;
    if(dfn[v]<=L2&&R2<=R[v]) continue;
    if(L1<=dfn[v]&&R[v]<=R1) {
        L1=dfn[v],R1=R[v];
        continue;
    } else if(L2<=dfn[v]&&R[v]<=R2) {
        L2=dfn[v],R2=R[v];
        continue;
    } else print(w);
}
print(-1);

时间复杂度:$O(m\log m)$,瓶颈为排序,排序优化后可至 $O(m)$。

posted @ 2023-08-23 22:21  djh0314  阅读(30)  评论(0)    收藏  举报  来源
浏览器标题切换
浏览器标题切换end