并查集:不相交集合
将编号分别为1......N的N个对象划分为不相交集合,在每个集合中,选择其中某个元素所在的集合
题型:1.合并两个集合
2.查找某元素属于哪个集合
查找
find(x)
{
return Set[x];
}
合并
Mergel(a,b)
{
i=min(a,b);
j=max(a,b);
for(k=1;k<=n;k++) //所有元素遍历一遍,
//满足条件的一个集合都进行改变成另一个集合,进行合并
{
if(Set[k]==j)
Set[k]=i;
}
}
查找:
find2(x)
{
r=x;
while(Set[r]!=r)
{
r=Set[r];
}
return r;
}
合并:
merge2(a,b)
{
Set[a]=b;
}
merge3(a,b)
{
if(height(a)==height(b))
{
height(a)=height(a)+1;
Set[b]=a;
}
else if(height(a)<height(b))
Set[a]=b;
else
Set[b]=a;
}
}
最小生成树
经典贪心算法,优先选最少 的路