種類並查集,思路以及細節在**和注釋中。
#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個動物所構成的食物鏈關係...