這次再發一遍是因為由關押罪犯get到了一種新的做法。將並查集開到n*3,對於某個動物a來說,a+n代表它吃的動物,a+2n代表吃它的動物,這樣我們就可以進行普通的並查集操作來得到答案了。注意判斷前後話語是否矛盾時應當分情況,如果是b,c同類,那麼如果b和c吃的動物或者c和b吃的動物在同乙個集合裡,那就是假話;如果b吃c,那麼如果b,c是同類或者b與c吃的動物在同乙個集合裡,就是假話。對於真話來說,如果b,c是同類,那麼就將b,c、b+n,c+n、b+2n,c+2n合併;如果b吃c,那麼將b吃的動物(b+n)與c合併,將吃b的動物b+n*2與c吃的動物c+n合併(環狀食物鏈),將b與吃c的動物(c+2*n)合併。最後輸出答案即可
#include#include#include#include#includeusing namespace std;
const int maxn=50010;
int t;
int ans=0;
int n;
int fa[maxn*3];
int find(int x)
void merge(int x,int y)
}bool check(int x,int y)
int main()
while(t--)
if(a==2&&b==c)
if(a==1)
}if(a==2)
}if(a==1)
if(a==2)
} cout
}
洛谷 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 y 表示...
洛谷 P2024 食物鏈(擴充套件域並查集)
動物王國中有三類動物 a,b,c,這三類動物的食物鏈構成了有趣的環形。a 吃 b,b 吃 c,c 吃 a。現有 n 個動物,以 1 n 編號。每個動物都是 a,b,c 中的一種,但是我們並不知道 它到底是哪一種。有人用兩種說法對這 n 個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示...