#include<bits/stdc++.h>
using namespace std;
const int N=30010;
int fa[N],d[N],size[N];//size表示以x爲樹根的集合大小
int find(int x)
{
if(fa[x]==x) return x;
int tt=find(fa[x]);
d[x]+=d[fa[x]];
// d[x]表示x到樹根的路徑邊權和
// d[x]+=d[fa[x]] 子節點加上父節點到根節點的距離
return fa[x]=tt;//把父節點重置爲根節點
}
void unite(int x,int y)
{
int tx=find(x),ty=find(y);
fa[tx]=ty;
d[tx]=size[ty];// size[x]表示以x爲樹根的集合大小
size[ty]+=size[tx];//集合元素增加
}
int main()
{
int n;scanf("%d ",&n);
for(int i=1;i<=30000;i++)
{
fa[i]=i;size[i]=1;
}
for(int i=1;i<=n;i++)
{
char c[2];scanf("%s",c);int x,y;scanf("%d%d",&x,&y);
if(c[0]=='M')
{
unite(x,y);
}else
{
int xx=find(x);
int yy=find(y);
//判斷在不在一條鏈子上
if(xx!=yy)
{
printf("-1\n");
}else
{
printf("%d\n",max(d[x],d[y])-min(d[x],d[y])-1);
}
}
}
}
銀河英雄傳說 並查集+ 邊帶權
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.