チームのグループ化
説明
中南大学ACM夏の合宿は、トレーニングはすべての選手Nに名前を付けるだろう始まろうとしている2つのグループに分け、ランキング訓練することによって臨床試験(それぞれ1、2、...、Nと番号付け)、元選手がKに分けグループA、Bに分割された残りのグループメンバー
しかし、今、それはグループAとBのグループのスタッフを決定する前に、アシスタントコーチCSGrandeurが誤って、その後CSGrandeurトレーニングスタッフ、任意の順位の訓練試行を失ったが、ではないがために、どのような各ランクを依頼する予定選手たちのグループは何を決定します。
しかし、選手たちは汚れとしてランキング訓練されているとして、漠然と何人かの人々はここに戻ってMメッセージCSGrandeurの最終合計に、各メッセージはタプル(x、y)を使用することができ、自分の後ろに来た覚えています(X!= y)は、Xのプレイヤーが覚えているよりも多くの後に自分自身に依存するY-位の選手を意味する、と述べました。
今CSGrandeurは情報のM個に応じて、あなたはプレーヤーそれのグループかどうかを確認することができ、知りたいですか?(デフォルトでは、すべての情報が事実と選手のトレーニングに反映されます。)
入力
テストデータの複数のセットを含む入力。
各試験のために、最初の行は3つの正の整数Nを含み(2 <= N <= 1000)、K(1 <= K <= N)、M(1 <= M <= 10000)、前出を意味します。次のM行はそれぞれX、Y、Xの各対は、それぞれの名前を表すために、情報のM個を記述する、2つの正の整数X、Y(1 <= xと、Y <= N、およびX!= Y)を有します私はに頼るよりも、自分のyの後にランキングで最初のチームの選手を覚えています。
出力
グループAのメンバーは、出力「YES」(引用符)は、そうでなければ(引用符なし)「NO」を出力する場合は、各試験のために、決定することができます。
サンプル入力
3 1 2 1 2 1 3 3 2 2 1 2 1 3
サンプル出力
YES
NO
ヒント
アイデア:彼は転送することができますどのように多くの人を判断することができ、すべての隣接リストの検索を行う、もし以上nmでのポイントは、その最初の名前メートル。
#include <ビット/ STDC ++ H.> 使用して 名前空間STD; のconst int型 MAXN = 1E5 + 5。 、 INTはじめ[MAXN]、次に[MAXN]、エッジ[MAXN] [ 2 ]; int型[MAXN] VISを、 INT追加(INT A 、int型 B、int型のC) { 次に[C] = 最初の[A]; //次のページの最初の発生を指し示すための情報、 最初の[A] =のCを; //タグがC現在のメッセージに表示される エッジ[C] [ 0 ] = 、 エッジ[C] [ 1。 =] B; } キュー < INT > Q。 INT BFS(INT I) { memsetの(VIS、0、はsizeof (VIS))。 しばらく(!q.empty()) q.pop(); q.push(I); int型 CNT = 0 ; VIS [I] = 1 。 一方、(!q.empty()) { int型 T = q.front()。 q.pop(); 用(INT J =最初の[T]!; J = - 1、J = 次の[J]) { 場合(VIS [エッジ[J] [ 1 ]] == 0 ) { VIS [エッジ[J] [ 1 ] = 1 。 q.push(エッジ[J] [ 1 ])。 CNT ++ ; } } } 戻りCNT。 } int型のmain() { int型N、M、K。 int型のXX、YY。 一方、(scanf関数(" %D%D%D "!、&N、&M、&K)= EOF) { memsetの(第一、 - 1、はsizeof (最初))。 memsetの(次、0、sizeof(次)); int型 CNT1 = 0 ; 用(int型 iは= 0 ; I <K iは++ ) { scanf関数(" %D%D "、およびXX、&YY)。 (私は、YY、XX)を追加。 } のために(int型 I = 1 ; <; I ++は= N iが) { 場合(BFS(I)> =(N- M)) { CNT1 ++ 。 } } もし(CNT1> = M) のprintf("YESの\ n" ); 他の printf関数(" NOの\ n " ); } }