做题记录整理并查集1 P1196 [NOI2002] 银河英雄传说(2022/9/16)
其实就是让并查集多维护一个参数而已
#include <iostream>
#include <cstdio>
#include<bits/stdc++.h>
#define for1(i,a,b) for(int i = a;i<=b;i++)
#define ll long long
#define mp(a,b) make_pair(a,b)
using namespace std;
int fa[500005],w[500005],t,num[500005];
int zhao(int x) {
if(x==fa[x])
return fa[x];
int k=fa[x];
fa[x]=zhao(fa[x]);
w[x]+=w[k];
num[x]=num[fa[x]];
return fa[x];
}
int main() {
cin>>t;
for1(i,1,500005)
fa[i]=i,num[i]=1;
for1(i,1,t)
{
char c;
int a,b;
cin>>c>>a>>b;
if(c=='M') {
int ji1=zhao(a),r2=zhao(b);
if(ji1==r2)
continue;
else
{
fa[ji1]=r2;
w[ji1]=w[r2]+num[r2];
num[r2]+=num[ji1];
num[ji1]=num[r2];
}
}
else {
int ji1=zhao(a),r2=zhao(b);
if(ji1!=r2)
printf("-1\n");
else
printf("%d\n",abs(w[a]-w[b])-1);
}
}
return 0;
}

浙公网安备 33010602011771号