同様貪欲、ツリーは、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を返します。 }