relation存的是 該結點相對于父結點的關係。
0代表同類 1代表父吃子2代表子吃父
理解三個公式:
①壓縮關係公式:
(relation[兒子]+relation[父親])%3== 兒子和爺爺的關係
②合併根節點關係公式:
((d-1)+3-ani[兒子2].relation+ani[兒子1].relation) % 3==兒子1的父親與兒子2的父親的關係
③在根節點相同、d==2的情況下,判定當前條件的關係是否與已知的關係衝突:
(3 - relation[兒子1] + relation[兒子2]) % 3 ==1
窮舉法均可證明三個公式的正確性。
(證明本寫完一遍了,可發表後空格全亂了)
特別注意:
①路徑壓縮時應保證父結點的正確性,可遞迴呼叫。
②cin超時
**如下:
#include#includeusing namespace std;
const int n = 50000 + 10;
int n, k;
int relation[n], pre[n]; //記錄與父節點的關係和父結點
int find(int animal) //在之前我寫過的非遞迴呼叫的路徑壓縮會導致利用了不正確的父結點而導致錯誤
void combine(int x,int y, int x, int y, int d)//合併根節點
void init(int n)//初始化
}int main()
else}}
cout << ans << endl;
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 ...