星球大战

 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 } 
原文地址:https://www.cnblogs.com/lcan/p/9896923.html