CF796D警察ステーションBFS +染色

同様貪欲、ツリーは、BFSで染色し、次いで、その側異なる色の2つのエンドポイントを列挙する。 

コード: 

#include <ビット/ STDC ++ H> 
に#define N 300006 
の#define setIO(S)freopenは(S ".IN"、 "R"、STDIN)
名前空間stdを使用。
ベクター<INT> G。  
キュー<整数> Q;   
[N] DIS、[N << 1]、NEX [N << 1]、U [N]、V [N]に、N INT、K、D、エッジ、VIS [N]、HD [N]。     
ボイド追加(INT U、V INT)
{ 
    NEX [++エッジ] = HD [U]、HD [U] =縁、[エッジ]へ= V。
} 
int型のmain()
{ 
    int型I、J。
    // setIO( "入力"); 
    scanf関数( "%D%D%D"、&N&K、&D)。
    用(i = 1; iは= K <; ++ I)
    { 
        int型のX; 
        scanf関数( "%のD"、&x)は、
        VIS [X] = xで、q.push(X)。
    }   
    iがn <(I = 1。
        scanf関数( "%d個の%d個"、&U&V)、(u、v)は、(、uとV)を追加追加します。  
        U [I] = U、V [I] = V。
    } 
    のための(;!q.empty())
    { 
        int型、U = q.front(); q.pop()。          
        以下のために(INT I = HD [U]; I; I = NEX [I])
        { 
            int型V =乃至[I]。
            IF(VIS [V] && DIS [U] +1 <= D!)
            { 
                VIS [V] = VIS [U]。
                DIS [V] = DIS [U] +1。     
                q.push(V);  
            } 
        } 
    }    
    のために(i = 1; iがn <; ++ I)
    { 
        IF(VIS [U [I] = VIS [V [I]]!)   
        { 
            G.push_back(I)。
        } 
    }
    printf( "%d個の\ n"、G.size())。
    用(i = 0; iはG.size()<; ++ I)のprintf( "%dの"、Gを[I])。
    0を返します。
}

  

おすすめ

転載: www.cnblogs.com/guangheli/p/11619417.html