标签:
并查集
何为并查集? 从字面意思上我们就可以看出并查集这种数据结构的功能就是合并和查询。 “并”也就是说把直接相关或者间接相关的一类事物连接起来, 而查询就是确定两个人是否有关系, 或许他们之间很陌生, 但是他们的朋友的朋友的朋友可能就是朋友, 这样也是存在关系。
学习并查集, 主要是学习其中的两个函数,
(a): void Find(int a) { } 此函数的功能有两个, 一个是前面说的查询功能, 另一个就是压缩路径, 何为压缩路径:看图:
图1 图2;
图1中10的父节点为9 , 经压缩路径后10 和 9 都成为了根节点6的儿子, 这就是路径压缩。
压缩路径代码有两种写法:
① 非递归路径压缩
int find(int a)
{
int r, j, k ;
r = a;
while(r != father[r])
r = father[r];
j = a;
while(j != r)
{
k = father[j];
father[j] = r;
j = k;
}
return r;
}
这种压缩路径方法也不是很复杂, 推荐使用;
② 递归路径压缩, 可能会爆栈。
int find(int a)
{
if(a == father[a])
return a;
else
return father[a] = find(father[a]);
}
这种写法较为简单, 节点数不是很多使用较为方便。这种方法压缩路径时利用回溯。 举个例子从父节点出发, 所有节点都在一条路径上 10—>2—>1—>5—>9—>3. , 压缩路径时在回溯过程中各子节点连到父节点上顺序为 2, 1, 5, 9, 3 ;理解了这些, 并查集也就差不多了, 本来也不是很复杂。
(b): void mercy(int a, int b) {} 函数功能不可能唯一, 主要功能是合并节点。直接上代码了。
void mercy(int a, int b)
{
int q = find(a);
int p = find(b);
if(q != p)
{
father[q] = p;
//return true;
}
//return false;
}
知道了并查集的合并, 查询, 基础并查集题目就可以尽情水了。 更高深的东西还得要自己去探索。 第一次写总结, 感觉还kuo yi.
标签:
原文地址:http://www.cnblogs.com/fengshun/p/4764582.html