先上非正解
并查集 没啥好说的
#include<cstdio> #include<cstring> int n,m,x,y,fa[500001],fro[500001],beh[500001]; char s[10]; int abs(int u) { return u>0 ? u:-u; } int findd(int u) { if(fa[u]==u) return u; int k=findd(fa[u]); fro[u]+=fro[fa[u]]; return fa[u]=k; } void add(int u,int v) { int kx=findd(u),ky=findd(v); fa[kx]=ky; fro[kx]=beh[ky]; beh[ky]+=beh[kx]; } int main() { scanf("%d",&m); for(int i=1; i<=30000; i++) { fa[i]=i; beh[i]=1; } while(m--) { scanf("%s%d%d",s,&x,&y); if(s[0]=='M') add(x,y); else if(findd(x)==findd(y)) printf("%d ",abs(fro[x]-fro[y])-1); else printf("-1 "); } return 0; }
下面是正解
用三万个队列模拟(待更新)(tao