これは私が見た中で最も青い水の問題です
質問はあなたがトポロジカルボードをソートすることではありません
トピックの効果;リスは、カメラが引っ掛かることはない壊しました
他に監視できるカメラは、隣接するチェーン店との側に十分に見てきましたが、私は最終的には隣接行列があまりにも安全か隣接リストにはできませんわかりません。ポイントはトポロジカル整列ではないので、それは、非常に単純なトポロジカルソートが考えることができる、そしてそれはゼロ度の点で、キャッチされないリスの順序が他のカメラの監視カメラは何もヒットしないしなければならないことが想定される最初のエッジからです段階的に進み、各ステップは、ポイントの同じ側に行くことはない(とドミノなど)。側ではなくカメラへのトポロジカルなソートは、ここで監視されていませんあなたはトポロジカル整列を知ることができ、良いリンクすることができます。
確かに、しますまず第一度ポイント0見つけ、その後、特定の時点では、他の浸透がゼロを指すようにしないためにあれば、この時点から見下ろし保つために始めた、それは、JJで、リス非常に貧しいです数は、それが残りのカメラを出力キャッチ。(各数値は、カウンタをインクリメントするカウンタと、カメラを破壊し安全にすることができるカウンタがカメラの総数に等しい場合、そのときは、総出力マイナスカメラカウンターではないだろう出力「YES」とし終了)
ACコード
書式#include <cstdioを> する#include <スタック> 使用して名前空間はstdを、構造体ノード { int型、U、V、NE。 } [ 100000 ]。 int型nは、NUM、NUM1。 int型のヘッド[ 10000 ]; int型へ[ 10000 ]; int型扁[ 1000年]。 BOOL使用[ 100000 ]。ボイド追加(INT U、INT V) { [ ++ NUM] .NE = 頭部[U]。 [NUM] .U = U。 [NUM] .V = V; ヘッド[U] = NUM。 } int型のmain() { スタック < INT > S。 scanf関数(" %のD "、&N) 以下のために(int型 i = 1 ; iは= N <; ++ I) { int型X、Y。 scanf関数(" %dの%のD "、およびX&Y)。 もし(使用[X] == 偽) 扁[ ++ NUM1] =のX。 一方、(Y - ) { int型XX; scanf関数(" %のD "、&XX)。 (X、XX)を加えます。 [XX] ++ ; もし(使用[XX] == 偽) 扁[ ++ NUM1] =のXX。 } } int型 qwq = 0 。 以下のために(int型 I = 1 ; I <= NUM1; ++ I) { 場合(に[扁[I]] == 0 ) { s.push(I); qwq ++ 。 } } 一方(!s.empty()) { int型のu = s.top(); s.pop(); 用(int型!; I = [U] I =ヘッドを0 ; iが= [i]は.NE) { [[i]は.V]にします - 。 もし([I] .V] ==に0 ) { s.push([I] .V)。 qwq ++ ; } } } もし(qwq == N) のprintf(" YESの\ n " ); 他 のprintf("%D \ N "、N - qwq); 戻り 0 ; }