種類並查集 關押犯人

2022-05-31 13:57:11 字數 1348 閱讀 6192

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 using

namespace

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

;}

view code

並查集 關押罪犯

題目描述 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...