対象は疑問を持っている、プットはprintfの(「*** \ n」を)交換する理由を理解していない、黒魔術正しくないのですか????
アレンジメント宴会最もデリケートな事は、座席配置にあなたの参照の宴会のお客様を与えることです。いずれにせよ、我々は、宴会テーブルで放電2ライバルを置くことができません!この骨の折れる作業では、ゲストのいずれかのために、彼らは席を配置することができるかどうかをプログラムが所有者を教えて書いてください、今すぐあなたに与えられています。
入力フォーマット:
最初の入力ライン3は正の整数与えられるN
合計数(≦100)、即ち、基準夕食のゲストに来て、1からのこれらの人々N
の数は、M
、ペアワイズのゲストの数との間の既知の関係であるK
ストリップクエリが番号。その後のM
行は、各ラインは、お客様に、フォームのペアの間の関係を与える:宾客1 宾客2 关系
ここで、关系
1は友人が、-1ライバルを示していることを示しています。二人は敵と味方両方にすることはできません。最後のK
数字の行が照会されるゲストのペアを1つ与えられました。
友人の友人は友人であることが想定されます。しかし、私の敵の敵は友、敵の友人は、必ずしも、必ずしも敵されていないではありません。単純な直接敵対的な関係は全く同じ席ではありません。
出力フォーマット:
各クエリの出力ラインの結果:ゲストは二人の友人ではなく、敵対関係、出力の間であれば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
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=110;
int s[N][N];
int f[N];
int find(int x){
if(x==f[x])return x;
return f[x]=find(f[x]);
}
void merge(int x,int y){
int t1=find(x);
int t2=find(y);
if(t1!=t2)f[t1]=t2;
}
int main(){
int n,m,k,x,y,z;
cin>>n>>m>>k;
for(int i=1;i<=n;i++)f[i]=i;
while(m--){
cin>>x>>y>>z;
s[x][y]=s[y][x]=z;
if(z==1)merge(x, y);
}
while(k--){//疑问:不明白为什么将puts换为printf("****\n")就不对了
cin>>x>>y;
if(s[x][y]==1)puts("No problem");
else if(s[x][y]==-1){
if(find(x)==find(y))puts("OK but...");
else puts("No way");
}else{
if(find(x)==find(y))printf("No problem");
else puts("OK");
}
}
return 0;
}