並查集習題

2021-07-29 05:23:25 字數 1728 閱讀 7180

時間限制

150 ms

記憶體限制

65536 kb

**長度限制

8000 b

判題程式

standard

作者 陳越

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

輸入格式:

輸入第一行給出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

okok but...

no way

並查集

#include#include#include#includeusing namespace std;

int f[105];

int map[105][105];

int find_set(int x)

void union(int x,int y)//合併

int main()

int judge1,judge2;

for(i=0;i>judge1>>judge2;

if(map[judge1][judge2]==1)//

cout<<"no problem"《寫這道題的時候好多人剛開始都對人數進行了預判來剪枝,因為這個錯了很多遍,我寫的時候本來也想把剪枝寫上,但寫著寫著忘了也沒加,反倒直接對了。

按理說加剪枝更好,不懂這個梗啊。。

#include#include#include#include#includeusing namespace std;

int f[5005];

int find_set(int x)

void unio(int x,int y)

int main()

}if(h==1)

break;

}if(h==1)

break;}}

else

h=1;

}if(h==0)

printf("great team!\n");

else

printf("bad team!\n");

}return 0;

}

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

並查集相關習題總結 上

學習kruskal的時候我們學習了並查集,那時候都是不帶權值的。今天找了一些並查集的題目寫了下,寫題時也參考了大牛的部落格 1.rank of tetris 如下 include include include include include include include include incl...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...