L2-010. 排座位
時間限制
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 4
5 7
2 3
7 2
輸出樣例:
No problem
OK
OK but…
No way
並查集
思路很簡單
如果是朋友的話 找他們各自的最前驅節點(祖先節點) 如果不相同, 就進行何必, 即一個祖宗作爲另一個祖宗的孩子 Emmmm
code:
#include <iostream>
using namespace std;
int F[105];
int Mp[105][105];
int find(int x)
{
int r=x;
while (F[r ]!=r)
r=F[r ] ;
return r ;
}
void join(int x,int y){
int a = find(F[x]),b = find(F[y]);
if(a != b)
F[a] = b;
}
int main()
{
int n,m,k;
while(cin>>n>>m>>k){
for(int i = 0;i <= n;i ++) F[i] = i;
int x,y,v;
for(int i = 1;i <= m;i ++){
cin>>x>>y>>v;
Mp[x][y] = Mp[y][x] = v;
if(v == 1)
join(F[x],F[y]);
}
int judge1,judge2;
for(int i = 1;i <= k;i ++){
cin>>judge1>>judge2;
if(Mp[judge1][judge2] == 1) cout<<"No problem"<<endl;
else if(Mp[judge1][judge2] == -1){
if(find(F[judge1]) == find(F[judge2])) cout<<"OK but..."<<endl;
else
cout<<"No way"<<endl;
}
else
cout<<"OK"<<endl;
}
}
return 0;
}