題目:
自己在做本題時最大的障礙就是:不會在乙個集合的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...