codeforces 445 B DZY Loves Chemistry【并查集】

题意:给出n种化学物质,其中m对会发生化学反应,每次加入化学物质进去的时候,

如果有能够和它发生反应的,危险值就乘以2,问怎样的放入顺序使得危险值最大

将这m对会反应的用并查集处理,统计每个连通块里面的元素个数,再将其减去1,加起来,就是2的指数

 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 using namespace std;
12 
13 #define foreach(i,c) for (__typeof(c.begin()) i = c.begin(); i != c.end(); ++i)
14 
15 typedef long long LL;
16 const int INF = (1<<30)-1;
17 const int mod=1000000007;
18 const int maxn=100005;
19 
20 int p[maxn];
21 vector<int> g[maxn];
22 
23 int find(int x){ return x==p[x]? x:p[x]=find(p[x]);}
24 
25 LL pow_my(int x){
26     LL ans=1;
27     for(int i=1;i<=x;i++) ans=(LL)ans*2;
28     return ans;
29 }
30 
31 int main(){
32     int n,m;
33     cin>>n>>m;
34     for(int i=1;i<=n;i++) p[i]=i;
35     
36     while(m--){
37         int u,v;
38         cin>>u>>v;
39         int x=find(u);
40         int y=find(v);
41         if(x!=y) p[x]=y;
42     }
43     
44     for(int i=1;i<=n;i++){
45         int x=find(i);
46         g[x].push_back(i);
47     }
48     
49     int ans=0;
50     for(int i=1;i<=n;i++){
51         if(g[i].size()!=0) ans+=g[i].size()-1;
52     }
53         
54     cout<<pow_my(ans)<<"
";
55     
56     return 0;
57 }
View Code
原文地址:https://www.cnblogs.com/wuyuewoniu/p/4481633.html