算法:
对于任何一个联通块,如果坍塌的是一个联通块中的割点的话,那么分割成的两个小联通块中必须保证各有一个出口。
我们考虑所有的割点将原图分割成若干个小联通块接下来分类讨论:
(1)小块不与任何一个割点相连,那我们需要在这里设立两个出口,以保证任何一个出口坍塌后,还有一个出口可用。
(2)小块只与一个割点相连,那么我们只需要设立一个即可,出口没坍塌或割点坍塌了就直接用,如果出口坍塌了,那则可以通过没坍塌的割点去另一个小块的出口。
(3)小块与超过一个割点相连,也就意味着,无论小块中的那个点塌了,都可以通过其他的点到另一个小块的出口。
Code:
#include<bits/stdc++.h>
#define rep(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
template<typename T> void read(T &num){
char c=getchar();num=0;T f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){num=(num<<3)+(num<<1)+(c^48);c=getchar();}
num*=f;
}
template<typename T>