小 X 的液体混合
思路
这道题我们可以用并查集。
先求出有多少个相连的团,然后用总的点数减去相连的有多少团,就能求出要乘多少次了。
有一点要注意的就是,因为乘的个数比较多,所以我们要用到高精乘。
代码
#include<cstdio>
#include<iostream>
using namespace std;
int a[1001],ans[10001],n,m,an,t,j;
bool b[1001];
int find(int x)//并查集查找一个点的集合
{
int h=x;
while (h!=a[h]) h=a[h];
return h;
}
int main()
{
scanf("%d%d",&n,&m);//读入
for (int i=1;i<=n;i++) a[i]=i;//初始化
for (int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);//读入
x=find(x);//并查集查找这个点集合
a[x]=find(y);
}
for (int i=1;i<=n;i++)
if (a[i]==i) an++;//找有多少相连的分块
ans[1]=1;
for (int i=1;i<=n-an;i++)//高精乘
for (int i=1;i<=1000;i++)
{
ans[i]=ans[i]*2+j;
j=ans[i]/10;
ans[i]%=10;
}
for (int i=1000;i>=1;i--)
if (ans[i]!=0) {t=i;break;}
for (int i=t;i>=1;i--) printf("%d",ans[i]);//输出
return 0;
}