洛谷P2024食物鏈 並查集補集的靈活運用

2022-05-12 13:44:06 字數 1016 閱讀 5540

題目:

自己在做本題時最大的障礙就是:不會在乙個集合的father改變時把相應的補集也跟著改變。

借鑑題解後,才明白原來就是把其補集也進行合併;由於fa陣列在改變,不要定義乙個變數為原來的find()在後面使用。

原來的亂七八糟**:

#include#includeusing namespace std;

int n,k,s;

int fa[2000005];

int find(int x)

int main()

if(a==1)

else if(!fa[c])fa[c]=b;

else

}if(a==2)

if(!fa[b])fa[b]=b;

if(!fa[c])fa[c]=c;

int u=find(b);

int v=find(c);

if(u==v||u==find(v+n)||v==find(u+2*n))s++;

else fa[v]==u+n,fa[u]=v+2*n;}}

printf("%d",s);

return 0;

}

改進後的**(ac):

#include#includeusing namespace std;

int n,k,s;

int fa[2000005];

int find(int x)

int main()

if(a==1)

}if(a==2)

}// for(int i=1;i<=n;i++)

// printf("fa[%d]=%d ",i,fa[i]);

// cout<}

printf("%d",s);

return 0;}/*

4 51 1 3

2 2 4

2 3 2

1 1 4

2 2 3

2*/

洛谷 P2024 食物鏈(並查集)

題意 有三種生物a,b,c,它們的關係是a吃b,b吃c,c吃a。現在給出一些語句,判斷是否是假話,輸出假話數量。輸入類似 a x y,如果a等於1,說明x,y是同類,a等於2說明x是y的天敵。思路 經典的並查集題目,用x表示生物本身,x n表示它的獵物,x 2 n表示它的敵人,具 體請看 注釋。如下...

P2024 食物鏈 補集

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

P2024 食物鏈 補集

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