1 #include<cstdio> 2 #include<iostream> 3 #define M 2000000 4 int cnt,fa[M],n,m,ans[M],k,f[M],a[M],head[M],next[2*M],u[2*M]; 5 int zhao(int a1) 6 { 7 if(a1==fa[a1]) 8 return a1; 9 fa[a1]=zhao(fa[a1]); 10 return fa[a1]; 11 } 12 void jia(int a1,int a2) 13 { 14 cnt++; 15 next[cnt]=head[a1]; 16 u[cnt]=a2; 17 head[a1]=cnt; 18 return; 19 } 20 int main() 21 { 22 scanf("%d%d",&n,&m); 23 for(int i=1;i<=m;i++) 24 { 25 int a1,a2; 26 scanf("%d%d",&a1,&a2); 27 a1++; 28 a2++; 29 jia(a1,a2); 30 jia(a2,a1); 31 } 32 scanf("%d",&k); 33 for(int i=1;i<=k;i++) 34 { 35 int a1; 36 scanf("%d",&a1); 37 a[i]=++a1; 38 f[a1]=1; 39 } 40 for(int i=1;i<=n;i++) 41 fa[i]=i; 42 ans[k]=n-k; 43 for(int i=1;i<=n;i++) 44 if(!f[i]) 45 for(int j=head[i];j;j=next[j]) 46 if(!f[u[j]]) 47 { 48 int b1=zhao(i),b2=zhao(u[j]); 49 if(b1!=b2) 50 { 51 fa[b1]=b2; 52 ans[k]--; 53 } 54 } 55 for(int i=k;i;i--) 56 { 57 f[a[i]]=0; 58 ans[i-1]=ans[i]+1; 59 for(int j=head[a[i]];j;j=next[j]) 60 if(!f[u[j]]) 61 { 62 int b1=zhao(a[i]),b2=zhao(u[j]); 63 if(b1!=b2) 64 { 65 fa[b1]=b2; 66 ans[i-1]--; 67 } 68 } 69 } 70 for(int i=0;i<=k;i++) 71 printf("%d ",ans[i]); 72 return 0; 73 }
这个题离线倒着处理 先把所有删的删掉,然后倒着加,用并查集维护即可,当然题目中删掉的是点,别忘了啊!!