输入样例:
4
M 2 3
C 1 2
M 2 4
C 4 2
输出样例:
-1
1
#include <bits/stdc++.h>
#define bug cout << "***************" << endl
#define fuck(x) cout << #x << " -> " << x << endl
#define endl '\n'
using namespace std;
constexpr int N = 1e5 + 10, inf = 0x3f3f3f3f;
int sze[30010], d[30010], fa[30010]; // d[x]表示x到fa[x]的距离,让第二个集合的每个点到新根节点的距离都加上size[pb];
// 即d[x]代表的该集合每一个点到根节点的距离;如果合并的话
int find(int x)
{
if (fa[x] != x)
{
int root = find(fa[x]);//必须先执行递归:找到根,
// 下一步fa[x]才是真正的根节点;
d[x] += d[fa[x]]; // 维护到根节点的距离;
fa[x] = root;
}
return fa[x];
}
void solve()
{
for (int i = 0; i <= 30010; i++)
{
fa[i] = i;
sze[i] = 1; // 一个集合里面的大小起初为1;
d[i] = 0; // 距离
}
int n;
cin >> n;
while (n--)
{
char op[2];
int a, b;
scanf("%s%d%d", op, &a, &b);
if (op[0] == 'M')
{
int pa = find(a), pb = find(b);
if (pa != pb)
{
fa[pa] = pb; // 更新集合关系(合并);
d[pa] = sze[pb]; // 更新距离
sze[pb] += sze[pa]; // 更新大小
}
}
else
{
int pa = find(a), pb = find(b);
if (pa != pb) // 不在一个队列之中
{
cout << -1 << endl;
}
else
{
printf("%d\n", max((int)0, abs(d[a] - d[b]) - 1));
}
}
}
}
signed main()
{
int T = 1;
while (T--)
{
solve();
}
return 0;
}