我覺著這道題是很經典的並查集+思維題;
題意很好理解,主要是如何去理解並查集+運用並查集解決這道題;
首先先把並查集搞明白:
並查集:用於歸類的資料結構;
我相信剛接觸的肯定懵逼,嘻嘻;
首先我用**釋:
那麼這就是它歸類的大概思路;那麼如何實現呢?其實如果你對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 ...