您的位置:首页 > 其它

hdu 3635 并查集

2015-03-02 15:13 232 查看
//
//  main.cpp
//  5.1.6
//
//  Created by Fangpin on 15/3/2.
//  Copyright (c) 2015年 Fangpin. All rights reserved.
//

#include <iostream>
#include <cstring>
using namespace std;
int set[10003],sum[10003],times[10003];
int find(int x){
if(x==set[x])
return x;
else{
int tem=set[x];
set[x]=find(set[x]);
times[x]+=times[tem];
}
return set[x];
}

int main(int argc, const char * argv[]) {
// insert code here...
int t,n,q;
scanf("%d",&t);
for(int ca=1;ca<=t;++ca){
scanf("%d%d",&n,&q);
for(int i=0;i<=n;++i){
set[i]=i;
sum[i]=1;
times[i]=0;
}
printf("Case %d:\n",ca);
while(q--){
char s[5];
scanf("%s",s);
if(s[0]=='T'){
int a,b;
scanf("%d%d",&a,&b);
int fa=find(a),fb=find(b);
if(fa!=fb){
set[fa]=fb;
times[fa]++;
sum[fb]+=sum[fa];
sum[fa]=0;
}
}
else{
int a;
scanf("%d",&a);
int fa=find(a);
printf("%d %d %d\n",fa,sum[fa],times[a]);
}
}
}
return 0;
}


并查集的运用,每次合并的时候注意多加一个记录元素个数的域。

本题较难的是第三个问题。容易发现,如果不加优化的话,该球被移动的次数恰是该数所在数的树中位置的节点深度。但为了减少时间复杂度,避免退化树的出现,应该加入路径压缩。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  hdu3635 并查集