这道题是并差集的简单应用
1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #define maxn 100010 5 using namespace std; 6 7 int x[maxn],y[maxn],flag[maxn],f[maxn],t[maxn]; 8 bool vis[maxn]; 9 10 inline int find(int x) 11 { 12 if(x==f[x]) return x; 13 return f[x]=find(f[x]); 14 } 15 int main() 16 { 17 int n,m,q; 18 scanf("%d%d",&n,&m); 19 for(int i=1; i<=m; i++) 20 { 21 scanf("%d%d",&x[i],&y[i]); 22 } 23 scanf("%d",&q); 24 memset(vis,false,sizeof(vis)); 25 for(int i=1; i<=q; i++) 26 { 27 scanf("%d",&flag[i]); 28 vis[flag[i]]=true; 29 } 30 for(int i=1; i<=n; i++) 31 f[i]=i; 32 for(int i=1; i<=m; i++) 33 { 34 if(!vis[i]) 35 { 36 int a=find(x[i]); 37 int b=find(y[i]); 38 if(a!=b) 39 f[a]=b; 40 } 41 } 42 int ans=0; 43 for(int i=1; i<=n; i++) 44 { 45 if(f[i]==i) ans++; 46 } 47 for(int i=q; i>0; i--) 48 { 49 int a=find(x[flag[i]]); 50 int b=find(y[flag[i]]); 51 t[i]=ans; 52 if(a!=b) 53 { 54 f[a]=b; 55 ans--; 56 } 57 } 58 for(int i=1; i<=q; i++) 59 { 60 if(i==q) printf("%d ",t[i]); 61 else printf("%d ",t[i]); 62 } 63 return 0; 64 }