經典演算法 並查集

2022-03-30 22:35:55 字數 1330 閱讀 9768

概述:

並查集(union-find sets)是一種非常精巧而實用的資料結構,它主要用於處理一些不相交集合的合併問題。一些常見的用途有求連通子圖、求最小生成樹的 kruskal 演算法和求最近公共祖先(least common ancestors, lca)等。

使用並查集時,首先會存在一組不相交的動態集合 s=,一般都會使用乙個整數表示集合中的乙個元素。

每個集合可能包含乙個或多個元素,並選出集合中的某個元素作為代表。每個集合中具體包含了哪些元素是不關心的,具體選擇哪個元素作為代表一般也是不關心的。我們關心的是,對於給定的元素,可以很快的找到這個元素所在的集合(的代表),以及合併兩個元素所在的集合,而且這些操作的時間複雜度都是常數級的。

程式**:

#include #include 

using

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 ...