總結 種類並查集

2021-09-28 18:46:29 字數 1482 閱讀 1033

種類並查集,是什麼東西,我也不知道,我就是在看別人題解時提到過這個名字,我粗略解釋一下,就是帶了種類的並查集???

好吧,這都不重要,重要的是,種類並查集到底該怎麼用。

種類並查集一般會分為幾個種類,根據題目,有時會分為兩類,即同類和敵人,在[noi2001]食物鏈

中分為了三類,分別是同類,食物和天敵

種類並查集一般陣列要相應開到幾倍,初始化時也要迴圈到幾倍。

一般根據題意,會有乙個迴圈,即x的食物是y,而y的食物z是x的天敵,合併時要一起合併

接下來著重[noi2001]食物鏈這一道題講一下如何使用種類並查集

因為題目中要判斷假話,這個其實可以不用太管,題目中只有兩種話,一種是x和y是同類,那麼如何判斷x和y是否是同類呢??

下面**就是我在上面剛剛分析的,x+n為x的食物,如果(x的食物)和y的祖先相同,則是假話,同理,x的天敵和y的祖先相同也是假話

if(find(x+n)==find(y)) ans++;

if(find(x+n*2)==find(y)) ans++;

第一種話終於解決了,下面我們來看第二種話,x的食物是y,即x+n的祖先和y的祖先相同

那麼下面兩種情況都是背離的

x和y是同一種類,即find(x)==find(y)

x的天敵是y,即x+2n的祖先和y的祖先相同,符合這兩種情況都是假話

我想這個**恐怕不用我寫,根據前兩個例子,我想你會很快推出來的

最後我們來考慮如何合併,既然x的食物是y,設y的食物是z,則z是x的天敵,那麼合併就很好寫了

merge(x+n,y);//x的食物與y合併

merge(x+n*2,y+n)//x的天敵與y的食物合併

merge(x,y+n*2)//x與y的天敵合併

最後發一下核心**,希望可以以思考為主,ac**僅供參考

if(x>n||y>n) ans++;//超出範圍,是假話

else if(z==1)

} else

}

下面書上的話送給大家

經過不斷的思考、分析,最終我們沒有用任何高階的演算法,僅靠遍歷、掃瞄,就非常簡潔、高效地解決了本題。

雖然很多問題的時間複雜度是有下界的,但從某種程度上說,演算法的設計、優化是永無止境的。

讀者不應被已有的思維束縛,或只滿足於得到ac,而是應該盡可能地挖掘、總結乙個模型的相關性質,**其本質。

截至作者完稿,使用搜尋引擎都會發現乙個有趣的現象,網路上的多數題解均採用了floyed、單調佇列等不必要的解法,提出不同思路者甚少,

由此可見,很多演算法學習者抄題解而欠思考的現象極其嚴重,這是每位讀者應該避免的行為。

種類並查集

先來經典題目poj 1182 其實我現在都不是很明白這個題是怎麼做的 這道題貌似是並查集和向量做的,其中的關係推斷現在不是很明白。只知道和根節點的關係有三種,一種是同類 rank x 0 一種是被根節點吃掉 rank x 1 一種是吃掉根基點 rank x 2 如果不是很明白這道題的話可以跳過這道題...

種類並查集

食物鏈 poj 1182 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y...

種類並查集

種類並查集是我自己分的類,下面是幾道相關的題,都要求分類。a bug s life 核心思想 不難發現,一旦我們有了兩個bug之間的關係,我們一定可以判斷出它們的性別異同,甚至可以相互推斷,比如 a 與 b 能 b 與 c 能 那麼就能推出 a,c 與 b 性別相反,我們把這三個成為已經建立了關係的...