#include<bits/stdc++.h>
using namespace std;
const int MAXN=400010;
vector<int> adj[MAXN]; //邻接表
int n,m,x,y,k,father[MAXN],B[MAXN],tot,ans[MAXN];
bool b[MAXN];
int find(int k) {
if(father[k]==k)return k;
else return father[k]=find(father[k]);
}
void Adjacency_List_storage(int v,int u) {
adj[u].push_back(v);
adj[v].push_back(u);
}
void union_find_merge(int v,int u) {
// cout<<"merge:"<<v<<" and "<<u<<endl;
v=find(v),u=find(u);
if(v==u)return;
else {
father[v]=u;
tot--;
// cout<<"A and B are merged,tot="<<tot<<endl;
}
}
int main() {
scanf("%d%d",&n,&m);
for(int i=0; i<n; i++) {
father[i]=i;
}
for(int i=1; i<=m; i++) {
scanf("%d%d",&x,&y);
Adjacency_List_storage(x,y);
}
scanf("%d",&k);
tot=n-k;
// cout<<"_______"<<endl;
ans[k+1]=tot;
for(int i=1; i<=k; i++) {
scanf("%d",&B[i]);
b[B[i]]=true;
}
// for(int i=0; i<n; i++) {
// cout<<"now:"<<i<<endl;
// for(int j=0; j<adj[i].size(); j++) {
// cout<<adj[i][j]<<" ";
// }
// cout<<endl;
// }
// for(int i=0; i<n; i++) {
// cout<<"b["<<i<<"]="<<b[i]<<endl;
// }
for(int i=0; i<n; i++) {
if(b[i]==false)
for(int j=0; j<adj[i].size(); j++) {
if(b[adj[i][j]]==false)
union_find_merge(i,adj[i][j]);
}
}
// for(int i=0; i<n; i++) {
// cout<<"father["<<i<<"]="<<father[i]<<endl;
// }
for(int i=k; i>=1; i--) {
// for(int j=1; j<=k+1; j++) {
// printf("ans[%d]=%d\n",j,ans[j]);
// }
tot++;
b[B[i]]=false;
for(int j=0; j<adj[B[i]].size(); j++) {
if(b[adj[B[i]][j]]==false)union_find_merge(B[i],adj[B[i]][j]);
}
ans[i]=tot;
}
for(int i=1; i<=k+1; i++) {
printf("%d\n",ans[i]);
}
return 0;
}
WA on #4~#9 求助!