题目链接

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;
}