238. 银河英雄传说 【带权并查集】
238. 银河英雄传说
题目链接:https://www.acwing.com/problem/content/240/
思路
是否在同一个集合很好维护,边带权记录某个节点到祖先(列的第一个节点)的距离就好。 然后查询两个节点的间隔就是:abs(w[a]-w[b])-1
代码
#include<bits/stdc++.h>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e6+10;
using namespace std;
int T;
int fa[maxn],w[maxn],sz[maxn];
void init(){
for(int i = 1;i<=30000;i++) fa[i] = i;
for(int i = 1;i<=30000;i++) sz[i] = 1;
}
int find(int x){
if(fa[x] != x){
int f = fa[x];
fa[x] = find(fa[x]);
w[x] += w[f];
}
return fa[x];
}
void join(int x,int y){
int fx = find(x),fy = find(y);
if(fx!=fy){
fa[fx] = fy;
w[fx] = sz[fy];
sz[fy] += sz[fx];
sz[fx] = 0;
}
}
int main(){
// debug;
ios;
init();
cin>>T;
char op;int a,b;
while(T--){
cin>>op>>a>>b;
if(op == 'M'){
join(a,b);
}else{
if(find(a) != find(b)) cout<<-1<<'\n';
else {
cout<<abs(w[a] - w[b])-1<<'\n';
}
}
}
return 0;
}Ryuichi的算法分享 文章被收录于专栏
分享我的一些算法题解,致力于把题解做好,部分题解可能会采用视频的形式来讲解。

