A 食物鏈(並查集 思維)

2021-09-26 06:28:56 字數 1381 閱讀 1168

我覺著這道題是很經典的並查集+思維題;

題意很好理解,主要是如何去理解並查集+運用並查集解決這道題;

首先先把並查集搞明白:

並查集:用於歸類的資料結構;

我相信剛接觸的肯定懵逼,嘻嘻;

首先我用**釋:

那麼這就是它歸類的大概思路;那麼如何實現呢?其實如果你對bfs記錄路徑很熟悉的話(只不過bfs記錄路徑需要stack回溯),那麼就應該明白如何利用乙個陣列來表示出自己的父節點;比如fa[1]=3這就表示1的父節點為3;那麼根節點又是怎麼樣的呢?根節點就是fa[3]=3(注意這點對後面樹的理解很重要!!);

明白了如何表示之後,那麼怎麼去查詢根節點呢?明顯可以模擬數的遞迴思想也就是(這裡可以自己利用fa[x]的特徵去理解):

int find(int x)
然後就是上面的1,2歸類為3,4,5一起,如果我能把根節點直接歸類到3不就能更高效了嗎?因為如果不利用好根節點,那麼只能乙個乙個歸類,豈不是很麻煩?

所以這裡有引入了乙個rank陣列;其實也沒什麼,它只不過是記錄樹的高度而已,比如:

兩個高度為3的合併之後就是4個(這裡我以左邊為父親來合併的);還有一種情況:

這種合併之後就高度不變,通過這樣的思想就可以很容易知道這點,如果我能按照這種思想去合併,那麼效率肯定就比較高了,不是嗎?

所以這裡引入了rank陣列來記錄樹的高度;

那麼並查集常用的操作就是這樣的:

const int maxn=5e6+5;

int fa[3*maxn],rank[maxn];

void init(int num)

}int find(int x)

void unite(int x,int y)

}int find(int x)

void unite(int x,int y)

if(d[i]==1)

}else

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

return 0;

}

並查集 食物鏈

noi2001,水題,但是我調了很久。食物鏈time limit 1000ms memory limit 10000k total submissions 27766 accepted 8066 description 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃...

並查集 食物鏈

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

並查集 食物鏈

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