题目:
![](http://10.156.31.134/admin/upload/images/2476-1.jpg)
思路:
用并查集来做,记录每个点的根节点,然后并查集,最后输出n减去根节点为自己的点,注意要高精。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
int n,m,x,y,f[1000],h,a[1000],num,maxn=400;
int find(int dep)
{
if(f[dep]==dep)return dep;
else return f[dep]=find(f[dep]);
}
void hb(int x,int y)
{
int xx=find(x);
int yy=find(y);
if (xx<yy) f[xx]=f[yy];
else f[yy]=f[xx];
}
void gjc()
{
a[1]=1; int j=0;
for (int i=1; i<=n-num; ++i) {
for (int i=1; i<=maxn; ++i)
{
a[i]=a[i]*2+j;
j=a[i]/10;
a[i]%=10;
}
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
f[i]=i;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
hb(x,y);
}
for(int i=1;i<=n;i++)
{
if(f[i]==i)
num++;
}
gjc();
for (int i=maxn;i>=1;--i)
if (a[i]!=0) {h=i; break;}
for(int i=h; i>=1; --i)
printf("%d",a[i]);
return 0;
}