优化朴素并查集
朴素并查集用数组存储元素,当数据很大或者数据量很多的时候,会导致无法查询,或者时间复杂度大幅上涨,可以用unordered_map来存储结点,unordered_map内部是哈希表,查询速度快.(自己曾在这里吃过大亏,印象挺深刻,但是题目已经忘了。)
unordered_map<int,int> tt;
int found(int x){
if(tt[x]==x) return x;
else tt[x]=found(tt[x]);
}//find函数
int thb()
{
tt.clear();
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
tt[a[i]]=a[i];
tt[b[i]]=b[i];//init
}
for(int i=1;i<=n;i++)//join
if(found(a[i])!=found(b[i]))
tt[found(a[i)]=tt(b[i]);
}
维护size的并查集
例题:https://www.acwing.com/problem/content/240/
例题:acwing 837
int p[N], size[N];
//p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量
// 返回x的祖宗节点
int find(int x)
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
// 初始化,假定节点编号是1~n
for (int i = 1; i <= n; i ++ )
{
p[i] = i;
size[i] = 1;
}
// 合并a和b所在的两个集合:
size[find(b)] += size[find(a)];
p[find(a)] = find(b);
维护到祖宗结点距离的并查集
例题:acwing银河英雄传说
int p[N], d[N];
//p[]存储每个点的祖宗节点, d[x]存储x到p[x]的距离
// 返回x的祖宗节点
int find(int x)
{
if (p[x] != x)
{
int u = find(p[x]);
d[x] += d[p[x]];
p[x] = u;
}
return p[x];
}
// 初始化,假定节点编号是1~n
for (int i = 1; i <= n; i ++ )
{
p[i] = i;
d[i] = 0;
}
// 合并a和b所在的两个集合:
p[find(a)] = find(b);
d[find(a)] = distance; //初始化find(a)的偏移数值
老家太冷了,最近几天都是感冒发烧,这篇就当回顾知识了,等好点了在补一次