並查集運用

2021-07-31 07:01:49 字數 1902 閱讀 6183

來點心得體會吧!

intfind(int x)

voidmerger(int a,int b)

*/if(r1>r2)

fa[r2]=r1;

else if (r1

fa[r1]=r2;

此處兩者的區別在於後者可以使得在整個家族裡邊的人都以最大

(或最小,只要改下大於號和小於號即可

)的為祖先; 比如

1,2,3,4,5,6,7,8,9,10

;是乙個家族,則

10(或1)

是這個家族的祖先;即

find(1,2,3,4,5,6,7,8,9,10)

都等於10

(或者1);

} 此外,對於並查集,如果

a,b,c,d,e,f…

等是同乙個家族的話,會發現所有

find(a)=find(b)=find(c)=find(d)=find(e)=find(f)=find(fa[a])

=find(fa[b])=find(fa[c])=find(fa[d])=find(fa[e])=find(fa[f])=…….

布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同席。

輸入格式:

輸入第一行給出

3個正整數:n(

<= 100

),即前來參宴的賓客總人數,則這些人從1到

n編號;

m為已知兩兩賓客之間的關係數;

k為查詢的條數。隨後

m行,每行給出一對賓客之間的關係,格式為:「賓客

1 賓客

2 關係

」,其中「關係

」為1表示是朋友,

-1表示是死對頭。注意兩個人不可能既是朋友又是敵人。最後

k行,每行給出一對需要查詢的賓客編號。

這裡假設朋友的朋友也是朋友。但敵人的敵人並不一定就是朋友,朋友的敵人也不一定是敵人。只有單純直接的敵對關係才是絕對不能同席的。

輸出格式:

對每個查詢輸出一行結果:如果兩位賓客之間是朋友,且沒有敵對關係,則輸出

「no problem」

;如果他們之間並不是朋友,但也不敵對,則輸出

「ok」

;如果他們之間有敵對,然而也有共同的朋友,則輸出

「ok but...」

;如果他們之間只有敵對關係,則輸出

「no way」。

輸入樣例:

7 8 4

5 6 1

2 7 -1

1 3 1

3 4 1

6 7 -1

1 2 1

1 4 1

2 3 -1

3 45 7

2 37 2

輸出樣例:

no problem ok

ok but...

no way

#include#include#include#includeusing namespace std;

int f[101],map[101][101];

int find(int x)

void merge(int a,int b)

int main()

for(int i=0;ielse

cout<<"ok"<}

return 0;

}

UNION並集運算

在集合論中,兩個集合 集合a和集合b 的並集是乙個包含集合a和b中所有元素的集合。換句話說,如果乙個元素屬於任何乙個輸入集合,那麼它也屬於結果集。如圖所示。對於集合運算,需要注意以下幾點 參與集合運算的兩個查詢生成的結果集必須包含相同的列數,並且相應列必須具有相容的資料型別。集合運算結果中的列名由第...

List 交集 並集 差集運算

有時候,為了需求,需要統計兩個 list 之間的交集,並集,差集。查詢了一些資料,現在總結在下面 1.獲取兩個list 的交集 方法一 a 2,3,4,5 b 2,5,8 tmp val for val in a if val in b print tmp 2,5 方法二 print list se...

POJ 1182並查集的經典運用

tag的取值 1表示x吃px,1表示px吃x,0表示x與px同類 include include include using namespace std typedef struct node vectornodes int n,k void makeset int findset int inde...