本题是带权并查集的简单题,考虑3点
1.合并用普通并查集。
2.维护d数组表示两者之间的舰队数量
3.维护size数组表示舰队的大小
#include<iostream> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<map> #include<vector> #include<cstdio> #include <unordered_map> using namespace std; const int N=2000005; const int inf=0x3f3f3f3f; typedef long long ll; unordered_map<int,int> s; int cnt; int p[N]; int size[N]; int d[N]; int find(int x){ if(x!=p[x]){ int root=find(p[x]); d[x]+=d[p[x]]; p[x]=root; } return p[x]; } int main(){ int t; cin>>t; int i,n; for(i=1;i<=30001;i++){ p[i]=i; size[i]=1; } while(t--){ string s; int x,y,i,j; cin>>s>>x>>y; if(s=="M"){ int pa=find(x),pb=find(y); d[pa]=size[pb]; size[pb]+=size[pa]; p[pa]=pb; } else{ int pa=find(x),pb=find(y); if(pa!=pb){ cout<<-1<<endl; } else{ cout<<max(0,abs(d[x]-d[y])-1)<<endl; } } } }