L2 010 排座位(C語言並查集)

2021-10-09 23:14:07 字數 2785 閱讀 4531

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

輸入格式:

輸入第一行給出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,42,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拿到的值是35拿到是值是44!=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為已知兩兩賓客之間...