E - Reachable Set

题目链接:https://atcoder.jp/contests/abc401/tasks/abc401_e

题意:

给定一个无向图,1为根节点。要求求出当k分别=1,2,3....n时
需要消除点使得1,2,3,..k的节点连通并且使消除的点最少

思路:

并查集+set
对于每一个k节点,与比k小的点进行merge,将比k大的点塞进集合中
如果k节点和1节点在同一个集合内,并且集合大小刚好等于k,那么说明这是一定是一个由1,2,3...k组成的连通块
同时只需要删除每一个节点相连的较大的点,使得删除的点数最小
当遍历到k时,需要将k从需要删除的集合中erase出来

vector<int>e[maxn];
int f[maxn];
int find(int x){
    if(f[x]!=x)f[x]=find(f[x]);return f[x];
}
int w[maxn];
void merge(int x,int y){
    if(find(x)!=find(y)){
        w[find(y)]+=w[find(x)];
        f[find(x)]=find(y);
        }
}
void solve(){
    int n,m;cin>>n>>m;
    rep(i,1,n)f[i]=i;
    rep(i,1,n)w[i]=1;

    rep(i,1,m){
        int u,v;cin>>u>>v;
        e[u].pb(v);e[v].pb(u);
    }
    set<int>st;
    rep(i,1,n){
        int k=i;
        st.erase(k);
        for(int v:e[k]){
            if(v>k)st.insert(v);else merge(k,v);
        }
        if(find(1)==find(k)&&w[find(1)]==k){
            cout<<st.size()<<endl;
        }else cout<<-1<<endl;
    }
}

posted @ 2025-04-15 20:16  Marinaco  阅读(27)  评论(0)    收藏  举报
//雪花飘落效果