带权并查集模板2(银河英雄传说)
这道题有30000个列。。。
所以说带权并查集在原模板的基础上就必须再添一个num数组,num[i]表示i队列的长度
算是涨了见识了。。。
code:
#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int fa[30005],val[30005],num[30005];
int find(int x)
{
if(fa[x]!=x)
{
int t=fa[x];
fa[x]=find(fa[x]);
val[x]+=val[t];
}
return fa[x];
}
int main()
{
int T;
scanf("%d",&T);
for(int i=1;i<=30000;i++)
{
fa[i]=i;
num[i]=1;
}
char pd;
int x,y;
while(T--)
{
cin>>pd;
scanf("%d%d",&x,&y);
if(pd=='M')
{
int px=find(x);
int py=find(y);
if(px!=py)
{
fa[px]=py;
val[px]+=num[py];
num[py]+=num[px];
num[px]=0;
}
//printf("qwq\n");
}
else
if(pd=='C')
{
int px=find(x);
int py=find(y);
if(px!=py)
{
printf("-1\n");
}
else
{
int tmp;
tmp=abs(val[y]-val[x]);
printf("%d\n",tmp-1);
}
}
}
return 0;
}