emmm又是乙個很高大上的概念
很久前就接觸過,可惜直到現在還是摸稜兩可。
核心概念就是:朋友的朋友是我的朋友
敵人的敵人是我的敵人
常見的做法是將原並查集擴大一倍規模,並劃分為兩個種類。
在同個種類的並查集中合併,和原始的並查集沒什麼區別,仍然表達他們是朋友
這個含義。
考慮在不同種類的並查集中合併的意義,其實就表達他們是敵人
這個含義了。
按照並查集美妙的傳遞性
,我們就能具體知道某兩個元素到底是敵人
還是朋友
了。
如果a和b是敵人,合併n+b和a,n+a和b
如果c和a是敵人,合併n+c和a,n+a和c
那麼b和c就並在一起了
因為a成為了他們的紐帶
那麼,我們來看一下這道題目。關押犯人
題面:n個犯人,m對關係,表示犯人a和犯人b的衝突值。
現在要把犯人分成兩類,要求在同乙個監獄中犯人的最大衝突值最小。
可以注意到,要減小衝突值,首先我們不能把衝突最大的分到一起。
比如,我們知道1和2肯定在不同的監獄,因為他們的衝突值太大了。
然後我們再考慮,在這個基礎上,4和3也最好也在不同的監獄
同理,1和3也是這樣,2和3,以此類推
但是我們不能無限這樣做下去,因為我們不能保證都在不同的監獄。
我們這麼想:1和2是敵人
4和3也是敵人
1和3是敵人
2和3是敵人
是不是發現,敵人的敵人就是我的朋友.
然後我們列舉到2和3的時候,發現他們是朋友
不可避免地,2和3衝突了。
#include usingview codenamespace
std;
int pre[40009
],n,m,l,r;
struct
p}a[
100009
];int find(int
x)void join(int q,int
w)int
main()
join(l+n,r);
join(r+n,l);
}cout
<<0
;}
並查集 關押罪犯
題目描述 s城現有兩座監獄,一共關押著n名罪犯,編號分別為1 n。他們之間的關係自然也極不和諧。很多罪犯之間甚至積怨已久,如果客觀條件具備則隨時可能爆發衝突。我們用 怨氣值 乙個正整數值 來表示某兩名罪犯之間的仇恨程度,怨氣值越大,則這兩名罪犯之間的積怨越多。如果兩名怨氣值為c的罪犯被關押在同一監獄...
種類並查集
先來經典題目poj 1182 其實我現在都不是很明白這個題是怎麼做的 這道題貌似是並查集和向量做的,其中的關係推斷現在不是很明白。只知道和根節點的關係有三種,一種是同類 rank x 0 一種是被根節點吃掉 rank x 1 一種是吃掉根基點 rank x 2 如果不是很明白這道題的話可以跳過這道題...
種類並查集
食物鏈 poj 1182 動物王國中有三類動物a,b,c,這三類動物的食物鏈構成了有趣的環形。a吃b,b吃c,c吃a。現有n個動物,以1 n編號。每個動物都是a,b,c中的一種,但是我們並不知道它到底是哪一種。有人用兩種說法對這n個動物所構成的食物鏈關係進行描述 第一種說法是 1 x y 表示x和y...