题意:给出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 }