Poj 食物鏈 解題報告 (種類並查集)

2021-08-13 14:28:55 字數 1019 閱讀 5655

種類並查集,思路以及細節在**和注釋中。

#include 

const

int maxn = 50010;

int fake; //記錄假話個數

int set[maxn]; //並查集的父節點

int relawithfarther[maxn]; //0 同類,1吃,2被吃,由這樣的定義可知相反關係計算方法為,若a和b關係為x,則b和a的關係為(3-x)%3,注意這裡的關係不是對稱的。

void ini()

}//一下「->」指吃

//注意如何計算本節點與樹根(即將成為本節點的父節點)的關係,由向量相加原理可得

//relawithfarther[node] = (relawithfarther[node] + relawithfarther[set[node]])%3,

//這裡模3是因為在這裡如果a->b->c,即relationwithfarther[a]=2, relationwithfarther[b]=2,

//得到隨後的relationwithfarther[a]=1。

int find(int node)

void union(int nodea, int nodeb, int relation)

}set[enda] = endb;

//見下圖:

//a---b

//| |

//c---d

//由向量相加可得relation(a,b) = relation(a,c)+relation(c,d)+relation(d,b)

relawithfarther[enda] = ((3-relawithfarther[nodea])%3 + relawithfarther[nodeb] + relation)%3;

}int main()

union(nodea, nodeb, relation-1);

}printf("%d\n", fake);

return

0;}

POJ 1182 食物鏈 解題報告 (種類並查集)

傳送門 我的題解和大牛們的不一樣啊首先說,我每個權值代表的方向基本和網上的題解都是相反的,比如 權值1 代表 x 吃 他的父親節點,權值2 代表 x 被 他的父親節點吃。其實這樣的話就是相當於我建的樹和他們的是相反的。如果wa的話,可以單步執行一下union函式看一看,有可能在路徑壓縮的時候沒有成功...

poj 食物鏈 (種類並查集)

種類並查集的經典題 飄過的小牛 關係域更新 當然,這道題理解到這裡思路已經基本明確了,剩下的就是如何實現,在實現過程中,我們發現,更新關係域是乙個很頭疼的操作,網上各種分析都有,但是都是直接給出個公式,至於怎麼推出來的都是一筆帶過,讓我著實頭疼了很久,經過不斷的看discuss,終於明白了更新操作是...

POJ 食物鏈 種類並查集

time limit 1000ms memory limit 10000k 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係...