题目链接
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;
}
京公网安备 11010502036488号