7-105シート行(25分)
アレンジメント宴会最もデリケートな事は、座席配置にあなたの参照の宴会のお客様を与えることです。いずれにせよ、我々は、宴会テーブルで放電2ライバルを置くことができません!この骨の折れる作業では、ゲストのいずれかのために、彼らは席を配置することができるかどうかをプログラムが所有者を教えて書いてください、今すぐあなたに与えられています。
入力フォーマット:
N(≦100)、すなわち、パラメータの総数は1からNまで番号が付けられている夕食のゲストに来る; Mは、各2人のゲスト間の既知の関係である:最初の行の入力は3つの正の整数を与え数; Kは、クエリの数です。続いて、M行は、各行がゲストの対の間の関係を与え、形式は:友人で表される関係は、-1ライバルを示す請求項1ゲストゲスト関係2、。二人は敵と味方両方にすることはできません。最後にK線は、各ゲストは、照会される数字の一組が与えられます。
友人の友人は友人であることが想定されます。しかし、私の敵の敵は友、敵の友人は、必ずしも、必ずしも敵されていないではありません。単純な直接敵対的な関係は全く同じ席ではありません。
出力フォーマット:
各クエリ結果の出力ライン用:ゲストは二人の友人ではなく、敵対関係、出力Noの問題の間であれば、そうでない場合、友人それらの中ではなく、敵対的、そして出力OK、彼らがでている場合敵対間、しかし...共通の友人、出力OKを持っていますが、彼らは唯一の出力Noの道間の敵対関係を持っている場合。
サンプル入力:
。7. 8. 4
5 6 1
2 -1 7
。1. 3. 1
3 1 4
6 7 -1
。1 2 1
。1. 1. 4
。2 -1 3
3 4
5 7
2 3
。7 2
出力例:
問題なし
OK
OKだが...
まさか
:考える
店の客に2次元配列の定義との関係だけで敵対関係は、直接の友人を判断することができます。
難易度は2例間の敵対関係があるということです。
ここ互いに素セットを使用するように、ゲストが友人のコレクションにマージされます、宿泊客が最終的に敵対的には同じ祖先を持っているかどうかを判断します。
(詩:収集と調査の方法を理解する上で読者は、この質問は比較的簡単ですか)
#include <bits/stdc++.h>
using namespace std;
int n, m, k;
int p[110],c[110][110];
int find(int x){ //找祖先
if(x!=p[x]) return find(p[x]);
return x;
}
void merge(int x, int y){ //合并两个结点
int xx=find(x);
int yy=find(y);
if(xx!=yy){
p[xx]=yy;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>m>>k;
for(int i=1; i<=n; i++) p[i]=i;
while(m--){
int a,b,r;
cin>>a>>b>>r;
c[a][b]=r;
c[b][a]=r;
if(c[a][b]==1) merge(a,b);
}
for(int i=0; i<k; i++){
int a,b;
cin>>a>>b;
if(c[a][b]==1) cout<<"No problem"<<endl;
if(c[a][b]==-1&&find(a)==find(b)) cout<<"OK but..."<<endl;
if(c[a][b]==-1&&find(a)!=find(b)) cout<<"No way"<<endl;
if(c[a][b]==0&&find(a)!=find(b))cout<<"OK"<<endl;
}
return 0;
}
批判補正をようこそ!!!