L i n k Link Link
D e s c r i p t i o n Description Description
T r a i n Train Train o f of of T h o u g h t Thought Thought
每一团相连的,第一个扔进瓶子里的都是没有作用的,此后所有与这个液体相连的扔进瓶子都可以使危险系数*2,所以可以用并查集求出有多少个相连的,用总点数减去相连的有多少团,就可以求出要乘多少次( x x x),然后求 2 x 2^x 2x了,要用到高精乘
C o d e Code Code
#include<cstdio>
#include<iostream>
using namespace std;
const int Maxn=355;
int r,f[1001],a[356],n,m,tot,tt;
int z[1001];
bool b[1001];
int find(int x)
{
r=x;
while (r!=f[r])
r=f[r];
return r;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1; i<=n; ++i)
f[i]=i;
for(int i=1; i<=m; ++i)
{
int x,y;
scanf("%d%d",&x,&y);
x=find(x);//找这个点的父节点
f[x]=find(y);//求出x这个点的父节点
}//父节点相同的都是同一个分块
for (int i=1; i<=n; ++i)
{
if (f[i]==i)
tot++;//求出有多少个相连的分块
}
a[1]=1; int j=0;
for (int i=1; i<=n-tot; ++i) {
for (int i=1; i<=Maxn; ++i)
{
a[i]=a[i]*2+j;
j=a[i]/10;
a[i]%=10;
}//高精
}
for (int i=Maxn; i>=1; --i)
if (a[i]!=0) {tt=i; break;}
for(int i=tt; i>=1; --i)
printf("%d",a[i]);
return 0;
}