并查集:查,并;
查:
int find(int x)
{
if(p[x]!=x) p[x]=find(p[x]);
return p[x];
}
并:
void unionn(int a,int b)
{
int r1 = find(a);
int r2 = find(b);
p[r2] = r1;
}
对p[N]进行初始化
for(int i = 1;i <= n;i ++) p[i] = i;
从1到n开始进行初始化;
二、记录并查集的元素个数的方法:
1、让大数服从小数
int a,b;
cin >> a >> b;
if(a>b) swap(a,b);
if(find(a)!=find(b)) unionn(a,b);
//查询和h相连个数
for(int i = 1;i <= n;i++)
if(find(p[i])==find(h))
ans++;
2、创造一个数组cnt[N]用来存储个数;
每次一次合并,同时将cnt[i]合并相加;
for(int i = 1;i <= n;i ++) cnt[i] = 1;//cnt[]初始化;
while(t--){
int a,b;
cin >> a >> b;
if(a>b) swap(a,b);
if(find(a)!=find(b)) unionn(a,b);
cnt[find(a)] += cnt[find(b)];//合并个数;
}
//查询和h想连的个数;
ans = cnt[find(a)];

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



