並查集 路徑壓縮

2021-10-18 01:21:20 字數 1655 閱讀 4215

const int maxn = 2000000 + 10;

int father[maxn];

int n;

void init()

}

int findfather(int x)
void union(int a, int b)
const int maxn = 10010;

int father[maxn];

int findfather(int x)

return x;

}

description

有乙個叫做「數碼世界」奇異空間,在數碼世界裡生活著許許多多的數碼寶貝,其中有些數碼寶貝之間可能是好朋友,並且數碼寶貝世界有兩條不成文的規定:

第一,數碼寶貝a和數碼寶貝b是好朋友等價於數碼寶貝b與數碼寶貝a是好朋友

第二,如果數碼寶貝a和數碼寶貝c是好朋友,而數碼寶貝b和數碼寶貝c也是好朋友,那麼a和b也是好朋友

現在給出這些數碼寶貝中所有好朋友的資訊問:可以把這些數碼寶貝分成多少組,滿足每組中的任意兩個數碼寶貝都是好朋友,而且任意兩組之間的數碼寶貝都不是好朋友

輸入的第一行有兩個正整數n(n <= 100)和m(m <= 100),分別表示數碼寶貝的個數和好朋友的組數,其中數碼寶貝編號為1~n。

output

輸出乙個整數,表示這些數碼寶貝可以分成的組數

sample input

7 5

1 22 3

3 11 4

5 6

sample output

#include #include#include#include#include#include#include#include#includeusing namespace std;

#pragma warning(disable:4996)

const int maxn = 10010;

int father[maxn];

bool isroot[maxn];

int findfather(int x)

return x;

}void union(int a, int b)

void init(int n)

}int main()

for (int i = 1; i <= n; i++)

isroot[findfather(i)] = true;

int ans = 0;

for (int i = 1; i <= n; i++)

ans += isroot[i];

printf("%d\n", ans);

return 0;

}

路徑壓縮 並查集路徑壓縮

如何描述乙個複雜的連線關係?如圖,很容易判斷緊鄰的2個人關係,但中間的連線很多很亂,怎麼判斷出兩個人的關係呢?並查集就是一種結構,通過儲存節點以及節點上的標籤,來判斷這兩個節點是否連線在一起。當兩個節點繫結時,可以任選其中乙個節點的標籤,指定另乙個節點。當判斷兩個節點是不是連線時,可以上溯節點的祖宗...

並查集 壓縮路徑

並查集 union findsets 一種簡單的用途廣泛的集合.並查集是若干個不相交集合,能夠實現較快的合併和判斷元素所在集合的操作,應用很多,如其求無向圖的連通分量個數等。最完美的應用當屬 實現kruskar演算法求最小生成樹。並查集的精髓 即它的三種操作,結合實現 模板進行理解 1 make s...

並查集路徑壓縮

使用並查集查詢時,如果查詢次數很多,那麼使用樸素版的查詢方式肯定要超時。比如,有一百萬個元素,每次都從第一百萬個開始找,這樣一次運算就是10 6,如果程式要求查詢個一千萬次,這樣下來就是10 13,肯定要出問題的。這是樸素查詢的 適合資料量不大的情況 int findx int x 下面是採用路徑壓...