求助

P1197 [JSOI2008] 星球大战

Judgelight @ 2022-10-26 22:11:48

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#define int long long
#define N 400009
#define M 400009
using namespace std;
int n,m,x,y,k,he[N],cnt,fa[N],vis[N],ans[N],distroy[N],jl[N],now,light[N],con;
int get(int x){
    return fa[x]==x?x:fa[x]=get(fa[x]);
}
struct Edge{
    int ne,to,flag;
}e[N];
void add(int u,int v){
    e[++cnt].ne=he[u];
    e[cnt].to=v;
    he[u]=cnt;
}
void dfs(int u){
    vis[u]=1;
    light[u]=1;
    for(int i=he[u];i;i=e[i].ne){
        int v=e[i].to;
        int fx=get(u),fy=get(v);
        fa[fx]=fy;
        if(vis[v]){
            continue;
        }
        dfs(v);
    }
}
inline void init(){
    for(int i=1;i<=n;i++){
        fa[i]=i;
    }
}
signed main(){
    cin>>n>>m;
    init();
    for(int i=1;i<=m;i++){
        cin>>x>>y;
        x++,y++;
        add(x,y);
        add(y,x);
    }
    cin>>k;
    for(int i=1;i<=k;i++){
        cin>>x;
        x++;
        distroy[i]=x;
        vis[x]=1;
        for(int j=he[x];j;j=e[j].ne){
            e[j].flag=1;
        }
    }
    for(int i=1;i<=n;i++){
        if(!vis[i]){
            con++;
            dfs(i);
        }
    }
    ans[k+1]=con;
    for(int i=k;i>=1;i--){
        int u=distroy[i];
        int flag=0;
        now=0;
        for(int j=he[u];j;j=e[j].ne){
            jl[++now]=e[j].to;
        }
        light[u]=1;
        for(int j=1;j<now;j++){
            int fx=get(jl[j]),fy=get(jl[j+1]);
            if(light[jl[j]]||light[jl[j+1]]){
                flag=1;
            }
            if(fx!=fy&&light[jl[j]]&&light[jl[j+1]]){
                con--;
            }
        }
        if(flag==0){
            con++;
        }
        for(int j=1;j<now;j++){
            int fx=get(jl[j]),fy=get(jl[j+1]);
            fa[fx]=fy;
        }
        for(int j=1;j<=now;j++){
            light[jl[j]]=1;
        }
        ans[i]=con;
    }
    for(int i=1;i<=k+1;i++){
        cout<<ans[i]<<endl;
    }
    return 0;
}

|