自己太逗了,,这题都没有自己写出来。。
1:不知道反着想,某个盒子下面的数=它上面的集合的数-他上面的数。。还是要看书。。
2:自己的又忘了要在这个地方路径压缩的时候要记得吧up【】弄好。。。
int fa[N],sum[N];
int up[N];
int Find(int x){
int fx=fa[x];
if(fa[x]!=x){
fx=Find(fa[x]);
up[x]+=up[fa[x]];
}
return fa[x]=fx;
}
void uni(int x,int y){
int fx=Find(x),fy=Find(y);
fa[fy]=fx;
up[fy]+=sum[fx];
sum[fx]+=sum[fy];
}
int main(){
int n;
while(~sf("%d",&n)){
rep(i,1,30000)fa[i]=i,sum[i]=1,up[i]=0;
rep(i,1,n){
char op[3];sf("%s",op);
int x,y;
if(op[0]=='M'){
sf("%d%d",&x,&y);
uni(x,y);
}
else{
sf("%d",&x);int par=Find(x);
pf("%d\n",sum[par]-up[x]-1);
}
}
}
}
本文通过一个具体的实现案例,详细介绍了并查集的基本概念及其应用,特别是路径压缩技术的实现细节。文章中提供了完整的代码示例,并针对常见的错误进行了分析与纠正,帮助读者深入理解并查集在解决特定问题时的应用。
472

被折叠的 条评论
为什么被折叠?



