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\n",ans[i]);
72     return 0;
73 }

这个题离线倒着处理 先把所有删的删掉,然后倒着加,用并查集维护即可,当然题目中删掉的是点,别忘了啊!!

posted on 2016-02-29 11:25  xiyuedong  阅读(...)  评论(...编辑  收藏