1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| const int MAX=4*1e5+10; int n,m,x,y,k,d[MAX]; int f[MAX],vis[MAX],ans[MAX]; int find(int x){ return f[x]==x?x:f[x]=find(f[x]); } void merge(int x,int y){ if(find(x)!=find(y)) f[find(y)]=find(x); } struct Edge{ int from,to,next; }edge[MAX*2]; int tot,head[MAX]; void init(){ tot=0; mem(head,-1); } void addedge(int x,int y){ edge[tot].from=x; edge[tot].to=y; edge[tot].next=head[x]; head[x]=tot++; } int main(){ freopen("in","r",stdin); mem(vis,0); init(); sf(n);sf(m); fi(i,0,n+1) f[i]=i; while(m--){ sf(x);sf(y); addedge(x,y); addedge(y,x); } sf(k); fi(i,0,k){ sf(d[i]); vis[d[i]]=1; } int total=n-k; fi(i,0,tot*2){ if(!vis[edge[i].from] && !vis[edge[i].to] && find(edge[i].from)!=find(edge[i].to)){ total--; merge(edge[i].from,edge[i].to); } } ans[k]=total; fd(k,0){ total++; vis[d[i]]=0; for(int j=head[d[i]];j!=-1;j=edge[j].next){ if(!vis[edge[j].to]&&f[find(d[i])]!=f[find(edge[j].to)]) { total--; merge(d[i],edge[j].to); } } ans[i]=total; } fi(i,0,k+1){ pf(ans[i]);pfc("\n"); } return 0; }
|