蒟蒻求助(悬赏关注)

P1197 [JSOI2008] 星球大战

gaojizhe05 @ 2024-07-04 19:00:51

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+7;
int n,m,a,b,k,f[maxn],fa[maxn],ans[maxn],cnt,t[maxn];
vector <int> e[maxn];
bool vis[maxn],isf[maxn],tag_fa[maxn];
bool con;
int find(int x){
    if(fa[x]==x) return x;
    return fa[x]=find(fa[x]);
}
void merge(int x,int y){
    int fx=find(x),fy=find(y);
    if(fx!=fy){
        fa[fx]=fy;
        if(con) cnt--;
        else con=1;
    }
}
void dfs(int u,int v){
    if(vis[u]||isf[u]) return;
    vis[u]=1;
    fa[u]=v;
    for(int i=0;i<e[u].size();i++) dfs(e[u][i],u);
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&a,&b);
        e[a].push_back(b);
        e[b].push_back(a);
    }
    scanf("%d",&k);
    for(int i=1;i<=k;i++){
        scanf("%d",&f[i]);
        isf[f[i]]=1,t[f[i]]=i;
    }
    for(int i=1;i<=n;i++) fa[i]=i;
    for(int i=1;i<=n;i++) dfs(i,i); 
    for(int i=1;i<=n;i++)
        if(!tag_fa[fa[i]]) tag_fa[fa[i]]=1,cnt++;
    cnt-=k;
    ans[k+1]=cnt;
    for(int i=k;i>=1;i--){
        con=0;
        for(int j=0;j<e[f[i]].size();j++) 
            if(!(isf[e[f[i]][j]]&&t[e[f[i]][j]]<i)) merge(f[i],e[f[i]][j]);
        ans[i]=cnt;     
    }
    for(int i=1;i<=k+1;i++) printf("%d\n",ans[i]);
    return 0;
} 

|