【NOI 2002】银河英雄传说(带权并查集)
(小声bb 我觉得带权并查集比较玄妙)
很容易想到用并查集来维护
设size表示当前队列的数量(以i为队头的数量),to_root表示当前节点到祖宗的距离
则对于每一个飞船,它到队头的距离,就等于它到它祖先的距离加上它祖先到队头的距离,而它的祖先到队头的距离,也可以变成类似的。可以在getfather时顺便维护
哎。。还有多久才能停课啊。。真的不想上文化课了。。。。。
#include<bits/stdc++.h> #define N 30005 using namespace std; int father[N],to_root[N],size[N]; inline int getfather(int x) { if(father[x]==x) return x; int ff=father[x]; father[x]=getfather(father[x]); to_root[x]+=to_root[ff]; return father[x]; } int main() { ios::sync_with_stdio(false); cin.tie(NULL),cout.tie(NULL); for(int i=1;i<=30001;i++) {father[i]=i;size[i]=1;} int T; cin>>T; while(T--) { char opt; int x,y,fx,fy; cin>>opt>>x>>y; fx=getfather(x),fy=getfather(y); if(opt=='M') { father[fx]=fy; to_root[fx]=size[fy]; size[fy]+=size[fx]; size[fx]=0; } if(opt=='C') { if(fx!=fy) { cout<<"-1"<<'\n'; continue; } cout<<abs(to_root[x]-to_root[y])-1<<'\n'; } } return 0; }
QQ40523591~欢迎一起学习交流~