小 X 的液体混合
题目大意:
在一个玻璃瓶里,放入一些液体,某一对液体放在一起会有反应,当某个液体有反应时危险度就会乘2(初值为1),问危险度最大是多少
原题:
解题思路:
记录下每一个点的根节点,然后并查集,最后输出n减去根节点是自己的点(无法产生反应的),就可以了
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,m,x,y,sum,fathx,fathy,a[350],father[1005];
int fa(int dep)//并查集
{if (father[dep]==dep) return dep;//自己是根节点return fa(father[dep]);//往父节点搜
}
void gjc()
{int t=0;for (int i=1;i<=310;++i){a[i]=a[i]*2+t;//高精乘t=a[i]/10;a[i]%=10;}
}
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=n;++i)father[i]=i;for (int i=1;i<=m;++i){scanf("%d %d",&x,&y);fathx=fa(x);//记录根节点fathy=fa(y);//根节点father[min(fathx,fathy)]=max(fathx,fathy);//把序号小的液体记为序号大的液体的父亲}for (int i=1;i<=n;++i)if (father[i]==i)//自己是根节点sum++;a[1]=1;//预处理for (int i=1;i<=n-sum;++i)//2的n-sum次方gjc();int k=310;//高精输出while (!a[k]&&k>0) k--;for (int i=k;i>0;--i)printf("%d",a[i]);
}