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)<<"\n";

55     

56     return 0;

57 }
View Code

 

你可能感兴趣的:(codeforces)