星球大战
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 const int maxn=5e5+7; 8 int n,m,num,k,tot; 9 int head[maxn],p[maxn],fa[maxn],ans[maxn]; 10 bool del[maxn],usd[maxn]; 11 struct Edge{ 12 int nxt,to,dis; 13 }edge[maxn]; 14 void add(int from,int to){ 15 edge[++num].nxt=head[from]; 16 edge[num].to=to; 17 head[from]=num; 18 } 19 int find(int x){ 20 if(x==fa[x]) return x; 21 return fa[x]=find(fa[x]); 22 } 23 void ins(int x){ 24 for(int i=head[x];i;i=edge[i].nxt){ 25 int v=edge[i].to; 26 if(usd[v]){ 27 int fx=find(x);int fv=find(v); 28 if(fx!=fv){ 29 tot--;fa[fx]=fv; 30 } 31 } 32 } 33 } 34 int main(){ 35 cin>>n>>m; 36 for(int i=0;i<n;i++) fa[i]=i; 37 for(int i=1;i<=m;i++){ 38 int u,v;cin>>u>>v; 39 add(u,v);add(v,u); 40 } 41 cin>>k; 42 for(int i=1;i<=k;i++){ 43 cin>>p[i];del[p[i]]=true; 44 } 45 for(int i=0;i<n;i++){ 46 if(!del[i]){ 47 tot++; 48 ins(i); 49 usd[i]=true; 50 } 51 } 52 ans[k+1]=tot; 53 for(int i=k;i>=1;i--){ 54 tot++; 55 ins(p[i]); 56 usd[p[i]]=true; 57 ans[i]=tot; 58 } 59 for(int i=1;i<=k+1;i++) cout<<ans[i]<<endl; 60 return 0; 61 }