[AHOI2005]航线规划

航线规划

题解

好水一树剖

最先看到这道题时,有点像缩点,不过又不知道缩点咋搞,于是想到了树剖。

我们会发现这是一个连通图呀,可联通图又该咋搞呢?我们发现一句很重要的话:

航线破坏后不可恢复

要求的又是关键航线,于是我们便想到了树。假设我们一直把它删下去,那么我们一定会得到一棵有n-1条边的树。既然图不好处理,我们为什么不反向把它变成一棵树呢?

所以我们就把它离线下来,从最后的状态建成一棵树。删边的操作看成加边的操作。我们先把每条边的边权赋成1,如果加边,一定会形成一个环,在将环上的边的边权改为0,明显的树剖板子了。可最后得到的图不一定是一棵树,所以我们还要把最后的图抽成一棵树,用并查集维护两点之间是否已连接,依次加最后图上的边时判断是否已连接,若已连接还要对它进行修改。

之后从后往前离线处理它所有的操作,也就是树上的修改与查询。

这样,就可以轻松将它切掉了。

源码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
using namespace std;
#define MAXN 50010
#define MAX
posted @ 2020-01-07 13:58  StaroForgin  阅读(6)  评论(0)    收藏  举报  来源