先解釋並查集
(僅個人理解針對類似本題的問題)
並查集是在陣列的基礎上,主要是一維陣列,本例也用一維陣列。如:int f[100];
1、先將一位陣列初始化,即f[i]=i;
2、用並查集表示相連的(或有關係)的點。
如下面的點:5-6、1-3、1-2、1-4;
(用一維陣列表示有關係的點即將f[第乙個點]最終等於的點等於f[第二個點]最終等於的點)
則將f[5]=f[6]、則改變f[5]=6,而f[6]仍然等於6;
類似的f[1]=f[3]=3、f[3]=[3];
而對於1-2則應找f[1]對應的值讓f[1]最終等於的值等於f[2]最終等於的值;而f[1]最終等於的點為3則應讓f[3]=2;注意此時f[1]仍然等於3並不等於2.
下面的點類似。
關係圖差不多如下
先這樣記著並查集思路,別想著自己想的優化啊啥的,先把基礎的記好
布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同席。
輸入格式:
輸入第一行給出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
#include
using
namespace std;
const
int maxn=
110;
int f[maxn]
,g[maxn]
[maxn]
;int
find
(int x)
//並查集主要功能函式1
void
operate
(int x,
int y)
//並查集主要功能函式 2
intmain()
for(
int i=
1;i<=k;i++
)}
PTA 排座位 (25 分)
布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同席。輸入第一行給出3個正整數 n 100 即前來參宴的賓客總人數,則這些人從1到n編號 m為已知兩兩賓客之間的關係數 ...
5 2 排座位 25分
5 2 排座位 25分 布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同席。輸入第一行給出3個正整數 n le 100 即前來參宴的賓客總人數,則這些人從1到n編號 ...
7 10 排座位 25分
布置宴席最微妙的事情,就是給前來參宴的各位賓客安排座位。無論如何,總不能把兩個死對頭排到同一張宴會桌旁!這個艱鉅任務現在就交給你,對任何一對客人,請編寫程式告訴主人他們是否能被安排同席。輸入第一行給出3個正整數 n 100 即前來參宴的賓客總人數,則這些人從1到n編號 m為已知兩兩賓客之間的關係數 ...