方向の小さなギリシャの感覚を訓練するために、ガルドンは室内N(N <= 10000)及びMチャネル(Mは<= 100000)、各チャネルが呼び出された場合には、一方向性であり、大規模な城を建て部屋Aと部屋Bの連通路は、部屋Bには、このチャネルを介して説明した客室でのみ到達することができますが、それを介してBの部屋に到達することができます部屋を示すものではありません。任意のiとjのために、部屋から部屋jへの少なくとも一つのパスがあるi、jはまた、部屋からのパスをしている可能性がありますガルドンは、すなわち、任意の二つの部屋が相互接続されているかどうかを確認するためのプログラムを書くことをお願いする必要があります部屋私。
データの複数のセットを含む入力入力は、入力の最初の行は、2つの数値を有する:N及びM、次のMラインの各2つの数AおよびBと、Bの部屋の部屋からチャネルを表すことができます。2ゼロでファイルと終了。
任意の二つの部屋が相互接続されている場合は、入力データの各セットのための出力は、出力は「はい」、そうでない場合は「いいえ」を出力します。
サンプル入力
3 3 1 2 2 3 3 1 3 3 1 2 2 3 3 2 0 0
サンプル出力
はい ノー
各ポイントは2つの値を維持するために同様のアイデアのDFSで、DFNは低タイムスタンプは、それが最低限のツリーのルートが含まれていることをするときに検索することがあります。円の周りそれに接続されたときに低==のDFN、それは、強連結グラフに追加されるべきです。
スタック< 整数 > STA; ベクター < INT > GRA [N]。 int型DFN [N]、低[N]、今、VIS [N]、合計; INTのN、M。 空隙 INI(ボイド) { memsetの(DFN、0、はsizeof (DFN))。 memsetの(低い、0、はsizeof (低))。 memsetの(VIS、0、はsizeof (VIS))。 今 =合計= 0 ; 以下のために(int型私= 1 ; iが<= N; iが++ ) GRA [I] .clear(); 同時に(sta.empty()== 0 ) sta.pop(); } ボイド tarjan(int型の、int型P) { VIS [S] = 2 ; DFN [S] =低[S] = ++ 今。 sta.push(S); 以下のために(int型 i = 0 ; I <GRA [S] .size(); iは++ ) { int型 T = GRA [S] [I]。 もし(!DFN [T]) tarjan(T、s)は、低[S] = 分(低[T]、[S]は低いです)。 それ以外の 場合(VIS [T] == 2 ) 低[S]= 分(低[S]、DFN [T])。 } であれば(低[S] == DFN [S]) { 合計 ++ 。 一方、(!sta.empty()) { int型 T = sta.top()。 sta.pop(); VIS [T] = 1 。 もしさ(t == s)は壊れます。 } } } ボイドラン() { ため(int型 i = 1 ; iが<= M; iは++ ) { int型、B。 scanf関数("%D%D "、&、&B); GRA [A] .push_back(B); } のための(int型 I = 1を iが<= N; iが++ ) 場合!(DFN [i])と tarjan(I、0 ); もし(合計> 1 ) COUT << " いいえ" << ENDL; 他 COUT << " はい" << ENDL; }