POJ 1182 食物鏈 (經典帶權並查集)

2021-07-22 09:13:26 字數 1129 閱讀 8733

第三次複習了,最經典的並查集

題意:動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b, b吃c,c吃a。

現有n個動物,以1-n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。

有人用兩種說法對這n個動物所構成的食物鏈關係進行描述:

「1 x y」,表示x和y是同類。

「2 x y」,表示x吃y。

此人對n個動物,用上述兩種說法,一句接一句地說出k句話,這k句話有的是真的,有的是假的。當一句話滿足下列三條之一時,這句話就是假話,否則就是真話。

1) 當前的話與前面的某些真的話衝突,就是假話;

2) 當前的話中x或y比n大,就是假話;

3) 當前的話表示x吃x,就是假話。

你的任務是根據給定的n(1 <= n <= 50,000)和k句話(0 <= k <= 100,000),輸出假話的總數。

/*n個動物 k句話 有一種迴圈a吃b 吃c c吃a 開始不知道n種動物關係是什麼

兩種詢問:d=1 x y為同類 d=2 x吃y 判斷假話條數(關鍵之違背之前的關係)

並查集可以很好解決的滿足區間傳遞關係的區間合併問題,注意一般是多棵樹*/

#include

#include

#include

using

namespace

std;

const

int max=50010;

int fat[max],ran[max];

void init(int n)//初始化重要

return;

}int find(int x)//找尋父節點+路徑壓縮

int union(int typ,int x,int y)//區間並與查詢

fat[x1]=y1;//連線兩父節點

ran[x1]=(-ran[x]+typ-1+ran[y]+3)%3;//使用類似向量方法來計算權值,雖然題目只有兩個,但是會出現被吃這種情況,所以要變成3種情況,注意一定要處理負數的情況

return0;}

int main()

printf("%d\n",ans);

return

0;}

POJ 1182 食物鏈 帶權並查集經典

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

poj 1182 食物鏈 帶權並查集

這個題需要將動物分成3種,每次以y 0為物件,吃他的x為1,需要注意的是下一次碰到x cha函式遞迴更新與x有關的物件 include include include includeusing namespace std define n 50005 int father n num n int c...

poj1182食物鏈 帶權並查集

基本思路 帶權並查集 簡單的理解就是將有關係的點合併到乙個集合,記錄每個點到集合根節點的權重 include include include define max 50010 using namespace std int par max 記錄集合根節點 int offset max 記錄每個節點到...