题目链接
https://codeforces.com/problemset/problem/445/B
解题思路
我直接想错了,我居然在找最大的连通区域,原来即使小的连通区域也会有贡献,我直接忽略了,不知道自己为何如此傻X。
思路:
n-连通分支数,是化学药品反应的次数,2^(n-连通分支数)为答案。
连通分支数用并查集来求。
AC代码
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1e5+100; int a,b,n,m,fa[N]; ll ans; int find(int x) { return fa[x]==x?x:fa[x]=find(fa[x]); } void join(int x,int y) { int rx=find(x),ry=find(y); if(rx!=ry) fa[rx]=ry; } int main() { cin>>n>>m; ans=(1LL<<n); //哇!一直哇在test7,我吐了,1后面必须有LL,要不移位操作移动的是整型1,系统基础没学好! for(int i=1;i<=n;i++) fa[i]=i; while(m--) { cin>>a>>b; join(a,b); } for(int i=1;i<=n;i++) if(fa[i]==i) ans>>=1; cout<<ans<<endl; }