來點心得體會吧!
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...