BZOJ 1015 [星球大战 starwar]

题面

题意

  给定无向图,每次删去一个点并求连通分量个数。

题解

  很难在删除点的同时维护联通分量个数,但是如果把操作倒序,问题就变成了每次往无向图里添加一个点并求连通分量个数。可以用并查集维护。


代码

#include
#include
#include
using namespace std;
const int maxn=4e5+5;
vector e[maxn];
int fa[maxn];
bool vis[maxn];
int arr[maxn],ans[maxn];
int ff(int u){ return fa[u]==u?u:fa[u]=ff(fa[u]); }
int main(){
    int i,j,n,m;
    int u,v;
    int cnt;
    scanf("%d%d",&n,&m);
    while (m--){
        scanf("%d%d",&u,&v);
        e[u].push_back(v); e[v].push_back(u);
    }
    scanf("%d",&m);
    for (i=0;i=0;i--){
        vis[arr[i]]=true; cnt++;
        for (j=0;j

你可能感兴趣的:(BZOJ 1015 [星球大战 starwar])