概述:
並查集(union-find sets)是一種非常精巧而實用的資料結構,它主要用於處理一些不相交集合的合併問題。一些常見的用途有求連通子圖、求最小生成樹的 kruskal 演算法和求最近公共祖先(least common ancestors, lca)等。
使用並查集時,首先會存在一組不相交的動態集合 s=,一般都會使用乙個整數表示集合中的乙個元素。
每個集合可能包含乙個或多個元素,並選出集合中的某個元素作為代表。每個集合中具體包含了哪些元素是不關心的,具體選擇哪個元素作為代表一般也是不關心的。我們關心的是,對於給定的元素,可以很快的找到這個元素所在的集合(的代表),以及合併兩個元素所在的集合,而且這些操作的時間複雜度都是常數級的。
程式**:
#include #includeusing
namespace
std;
class
unionfindset
m_nsetscount =max;
}int find(int
x)
void unionset(int x, int
y)
for (unsigned int i=0; ii)
}--m_nsetscount;
}intcount()
bool sameset(int x, int
y)
private
: vector
m_vecid;
intm_nsetscount;
};test(algo, tunionfindset)
; unionfindset uf;
uf.makeset(7);
uf.unionset(
0,2); //
a c uf.unionset(2,3); //
c e uf.unionset(3,6); //
e fuf.unionset(
1,4); //
b d uf.unionset(4,5); //
d eassert_true(uf.sameset(
0,3));
assert_true(uf.sameset(
6,2));
assert_true(uf.sameset(
1,5));
assert_false(uf.sameset(
0,5));
assert_false(uf.sameset(
2,1));
assert_false(uf.sameset(
6,4));
}
經典並查集
小雷的冰茶几 problem description 小雷有個特殊的癖好,平時喜歡收藏各種稀奇古怪的東西,譬如。還有。也包括。小雷是乙個喜歡分享的童鞋,這次小雷又給大家帶來一套神奇的東西,那就是舉世無雙的冰茶几!顧名思義,這些茶几被冰凍住了,最主要的是他們是易碎品,畢竟被凍住了。因此小雷要很小心翼翼...
並查集演算法
所謂並查集,它是乙個集合,這個集合的元素也是集合,他支援三種操作 makeset x 建立乙個只有乙個元素x的集合x0,將這個集合放入並查集中 findset x 在並查集中尋找乙個元素s 注意並查集的元素s也是集合 滿足 x屬於s union x,y 將並查集中的元素s1,s2合併,其中x屬於s1...
並查集演算法
並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。讓每個元素構成乙個單元素的集合,也就是按一定順序將屬於同一組的元素所在的集合合併。1 makeset s 建立乙個新的並查集,包含s個單元素集合。2 union x,y 把x ...