種族並查集

2021-08-29 05:21:58 字數 1094 閱讀 1677

蒟蒻太菜了…大佬又要嘲諷我了 用處

對於普通的並查集,我們只維護了每個元素之間的同類關係,但是如果給的關係不一定是同類,可能是像團夥裡一樣對立的關係,像食物鏈一樣的a→b

,b→c

,c→a

a\to b,b\to c,c\to a

a→b,b→

c,c→

a的關係,這時候就要用到種族並查集。

實現種族並查集,就是把同乙個集合中的每個元素賦予多個不同的屬性,在不同屬性的對應元素間建立關係,關係與關係之間能夠雖然有冗餘,但是互相聯絡能夠很快得出兩個元素之間的關係

太懶不想畫圖了,這是很形象的題解

經典題目

團夥關押罪犯

食物鏈

#include

#define n 50005

using

namespace std;

int ans, fa[n *3]

;inline

intgfa

(int x)

inline

bool

check

(int a,

int b)

inline

void

unite

(int a,

int b)

intmain()

while

(k--)if

(a == b)

if(x ==1)

unite

(a, b)

;unite

(a + n, b + n)

;unite

(a +

(n <<1)

, b +

(n <<1)

);}if

(x ==2)

unite

(a, b + n)

;unite

(a + n, b +

(n <<1)

);unite

(a +

(n <<1)

, b);}

}printf

("%d\n"

, ans)

;return0;

}

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...

並查集,帶權並查集

題意 ignatius過生日,客人來到,他想知道他需要準備多少張桌子。然而一張桌子上面只能坐上相互熟悉的人,其中熟悉可定義成為a與b認識,b與c認識,我們就說a,b,c相互熟悉 例如a與b熟悉and b與c熟悉,d與e熟悉,此時至少需要兩張桌子。輸入 t表示樣例個數,n表示朋友個數,朋友從1到n編號...