ural 1671 Anansi's Cobweb

这道题是并差集的简单应用

 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 }
View Code
原文地址:https://www.cnblogs.com/fanminghui/p/3604230.html