【高精】【并查集】小X的液体混合

L i n k Link Link

SSL 2476
并查集讲解

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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值