布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同席。
輸入格式:
輸入第一行給出3個正整數:n(≤100),即前來參宴的賓客總人數,則這些人從1到n編號;m為已知兩兩賓客之間的關係數;k為查詢的條數。隨後m行,每行給出一對賓客之間的關係,格式為:賓客1 賓客2 關係,其中關係為1表示是朋友,-1表示是死對頭。注意兩個人不可能既是朋友又是敵人。最後k行,每行給出一對需要查詢的賓客編號。
這裡假設朋友的朋友也是朋友。但敵人的敵人並不一定就是朋友,朋友的敵人也不一定是敵人。只有單純直接的敵對關係才是絕對不能同席的。
輸出格式:
對每個查詢輸出一行結果:如果兩位賓客之間是朋友,且沒有敵對關係,則輸出no problem;如果他們之間並不是朋友,但也不敵對,則輸出ok;如果他們之間有敵對,然而也有共同的朋友,則輸出ok but…;如果他們之間只有敵對關係,則輸出no way。
輸入樣例:
784
5612
7-11
3134
167-
1121
1412
3-13
4572372
輸出樣例:
no problem
okok but...
no way
思路分析:朋友的朋友是朋友,而敵人的敵人和朋友的敵人,敵人的朋友關係不確定,因此可以用一維陣列**fir**採用並查集存放朋友之間的關係,用個二維陣列 =flat單獨存放敵人的關係
例如題目中給出的關係資訊抽象成圖形
把是朋友關係的點連線起來,如果兩個點之間能夠到達,就說明這兩人是朋友關係,如1,4、2,3是朋友,像1,6就不是朋友
現在來模擬下查詢和合併的過程
最下端的值作為當前陣列fir下標對應的值
561
27-1
1313
4167
-112
1141
23-1
index12
3456
7初始化12
3456
7輸入5,612
3456->5
71,312
3->145
573,4121
4->155
71,2
12->111
5571,411
1155
7最終的關係11
1155
7第一組朋友關係是1,3就是說,可以把1當作一組朋友群的首領,每個人對應的首領是一樣的,那麼就都是朋友
這裡1,2,3,4的關係都是朋友,5,6是朋友
345初始化12
345輸入3,1
1->323
453,23
2->334
54,533
345->4
1,5333
4->3
4最終的關係33
334這裡第一組朋友3,1,把3當作頭,到1,5的時候,1拿到的值是3,5拿到是值是4,4!=5,要繼續向4拿,向4拿到的值是4,此時兩個拿到的值不一樣,需要再確立頭的關係,fir[4] = 3
最後他們的頭都是3,頭一樣說明之間都可以是朋友
壓縮路徑:比如現在找find(5),5拿到4,繼續4拿到3,再3拿到3,此時將5賦值為3,那麼下次再找find(5)時,就可以直接5拿到3,減少呼叫的次數
最後輸出的時候分別判斷是否是朋友,是否的敵人的關係
ac**:
#include
#include
int fir[
105]=;
//用做合併是否是朋友
int flat[
105]
[105]=
;//標記是否是敵人 1為敵人
intfind
(int x)
intmerge
(int a,
int b)
intmain
(int argc,
char
*ar**)
for(i=
0;i)else
}int b1,b2;
for(i=
0;i)else
if(b1!=b2&&flat[a]
[b]==0)
else
if(b1==b2&&flat[a]
[b]==1)
else
}return0;
}
L2 010 排座位(並查集)
題目鏈結 給一群人的關係有敵對和友好,朋友的朋友也是朋友,現在你任意兩個人的輸出相應的語句。用並查集來處理朋友關係,用vector來儲存敵對關係,判斷時兩個都對比下就好了 include include include include using namespace std define inf 0...
L2 010 排座位 並查集
時間限制 150 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同...
L2 010 排座位(並查集)
布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同席。輸入格式 輸入第一行給出3個正整數 n 100 即前來參宴的賓客總人數,則這些人從1到n編號 m為已知兩兩賓客之間...