NOI2002银河英雄传说——带权并查集
题目:https://www.luogu.org/problemnew/show/P1196
注意带权并查集的写法,以及集合长度(len[])的实现。
代码如下:
#include<iostream> #include<cstdio> using namespace std; int t,a,b,fa[30005],len[30005],pos[30005]; char dc; int find(int x) { if(fa[x]==x)return x; int f=find(fa[x]); pos[x]+=pos[fa[x]]; return fa[x]=f; } int main() { scanf("%d",&t); for(int i=1;i<=30000;i++)fa[i]=i,pos[i]=0,len[i]=1; for(int i=1;i<=t;i++) { scanf(" %c",&dc); scanf("%d%d",&a,&b); if(dc=='M') { int u=find(a); int v=find(b); fa[v]=u; pos[v]=pos[u]+len[u]; len[u]+=len[v]; // len[v]=len[u]; } else { int u=find(a); int v=find(b); if(u!=v)printf("-1\n"); else { int ans; if(pos[a]>pos[b])ans=pos[a]-pos[b]-1; else ans=pos[b]-pos[a]-1; printf("%d\n",ans); } } } return 0; }