羅区[P1262]スパイ網

説明

ポイントは賄賂であれば、Pポイントは、xの量を買収、買収することができますn個の点を考えると、彼はその場に指摘買収されます

要件:あなたがすべて出力することができない場合はNO贈収賄や贈収賄ポイントが支払われるそうでない場合は、出力YESと最小量ことはできません

溶液

私たちは、Ruoguoはポイントを持って訪問されていない、これは確かにプログラムの終わりではないことを示すことは直接出力と贈収賄で、DFN再び、tarjanポイントで最後のスイープを縮小することができます

だから、すべての場合は、それを買収することができますか?私達はちょうどポイントを買収内部の強い中国聯通コンポーネントことtarjan賄賂時に、必要なときに、他のすべては、我々は最小値を取得するだけでなく、比較されていることになると思います

但し 

中国聯通中国聯通のコンポーネントの別の強力なコンポーネントへの強力なポイントならば、我々はそれを最小限に中国聯通の別の強力な構成要素を指すことができます

学生は尋ねた:中国聯通の強い要素がある場合は、最小ポイントよりも小さい値に指摘している、それを使用することではないでしょうか?

あなたは、彼が中国聯通の別の強力な構成要素を指しているので、他のお金を費やす必要はありませんので、我々はちょうど0の強さの度合いをカウントする必要があり、私たちのコストをx、今回中国聯通ポイントの強力なコンポーネントを選択した場合、答えはノーですユニコムコンポーネント、およびその上に累積答え

注意:(スタック[トップ] = U!)の特殊例2種類があるため、更新の答えを持っている必要があり、フロントの背後にいる間tarjanを作るとき:スタックの先頭にuとし、尾を積み重ねもちろん、あなたが書き込むことはできませんので、直接トップ+ 1しばらくに(スタック[トップ+ 1]!= U)を

コード

 

#include <ビット/ STDC ++ H>
 のconst  int型 INF = 1E9 + 10 使用して 名前空間はstdを、
int型SH、N、P、R、NUM、上部、COL。
INT月[ 3010 ]、コイン[ 3010 ]、ヘッド[ 10010 ]、[DFN 3010 ]。
int型 ST [ 3010 ]、CO [ 3010 ]、低[ 3010 ]、SI [ 3010 ]、VIS [ 3010 ];
int型の ANS [ 3010 ]、RU [ 3010 ];
構造体emmm {
     int型、隣。
} E [ 10010];
無効 tarjan(INT U){ 
    ST [ ++トップ] = U。
    DFN [U] =低[U] = ++ SH。
    VIS [U] = 1 以下のためにint型 ; I I = I =ヘッド[U] {E [I] .next)
         int型、V = E [I] .TO。
        もし(!{[V] DFN)
            tarjan(V)。
            低[U] = 分(低[U]、[V]低いです)。
        } 
        そう であれば(!CO [V])に
            ロー[U] = ([V] DFN低い[U])分。
    } 
    場合(DFN [U] == 低[U]){ 
        共[U] = ++ 首。
        [COL]もし ++ ; 
        年[COL] = 分(年[COL]、私[ST [トップ]]);
        一方、(ST [トップ] =!U){ 
            もし[COL] ++ ; 
            CO [ST [トップ] = COL。
            午前[ST [トップ]] = 0 ; 
            年[COL] = 分(年[COL]、私[ST [トップ]]); 
            トップ - ; 
        } 
        年[COL] = 分(年[COL]、私[ST [トップ])。
        トップ - ;
    } 
    を返します
} 
ボイド追加(INT  からINT に){ 
    E [ ++ NUM] .next =ヘッド【から]。
    E [NUM] .TO = であり; 
    【ヘッドから ] = NUM。
} 
int型のmain()
{ 
    IOS :: sync_with_stdio()。
       CIN >> N >> P;
       以下のためにint型 i = 1 ; iがn = <; I ++ 
           月[I] = INF。
       以下のためのint型i = 1 ; iが<= N。I ++ 
           ANS [I] = INF - 110 int型 iは= 1 ; I <= P iが++ ){
            int型、U、M。
           CIN >> U >> メートル。
           月[U] = M。
       } 
       CIN >> R。
       以下のためにint型 iは= 1 ; iが<= R; iは++ ){
            int型、B。
           CIN >> A >> B; 
           追加(A、B)。
       } 
       のためにINT i = 1 ; iが++; iが<= N であれば(!DFN [I] &&月[I] = INF)
               tarjan(I)。
       以下のためにint型 I = 1 iは++; iが<= N であれば(!DFN [I]){ 
               COUT << " NO " << ENDL << I << ENDL。
               リターン 0 ; 
           } 
       のためにint型 i = 1 ; iがn = <; I ++ のためのINT J =頭部[i]は、J、J =E [J] .next) 
               もし(!コ[I] = 共同[E [J] .TO])
                   RU [コ[E [J] .TO]] ++ ;
       int型 ANSS = 0 ;
       以下のためにint型 I = 1 ; I <= COL;私は++ の場合(!RU [i])と
               ANSS + = ANS [i]は、
       裁判所未満 << " YES " <<てendl << ANSS << てendl;
    リターン 0 ; 
}
ACコード

 

おすすめ

転載: www.cnblogs.com/-sheldon/p/11403635.html