题解 P1196 [NOI2002]银河英雄传说
分析
带权并查集模板,用sum数组维护到根的距离,num维护以该点为队头的船齐霸业数
Code
#include<bits/stdc++.h>
using namespace std;
int T,ip1,ip2,num[30010],sum[30010],n,fa[30010];;
char op;
int find(int x)
{
if(fa[x]==x)
return x;
int root=find(fa[x]);
sum[x]+=sum[fa[x]];
return fa[x]=root;
}
int main()
{
cin>>T;
for(int i=1;i<=30000;i++)
{
fa[i]=i;
num[i]=1;
}
while(T--)
{
cin>>op>>ip1>>ip2;
int f1=find(ip1);
int f2=find(ip2);
if(op=='M')
{
sum[f1]+=num[f2];
fa[f1]=f2;
num[f2]+=num[f1];
num[f1]=0;
}
if(op=='C')
{
if(f1!=f2)
cout<<-1<<endl;
else
cout<<abs(sum[ip1]-sum[ip2])-1<<endl;
}
}
}