問題の意味
あなたの側無根木の数を与え、それぞれの側号をマークにするには、接続された各ポイントの要件を繰り返すことができます。
今、あなたはいくつかのポイントの要件を無視することができ、あなたの「割引」を与えるために
あなたは最小限にどのように多くの番号を尋ねます
このツリーのうちの出力
問題の解決策
その後、最高度のk個のポイントを無視し、各点の次数統計、各点が必要とどのように多くの数字を検討し、これは程度のポイントです。
その数は(すべての点を無視することが可能であることに注意していますが、ジョブの数を持っている必要がどんなに)のk + 1大型度の数に等しいです
それからちょうど貪欲DFS始まる行上の点を選びます
コード
#include <ビット/ STDC ++ H> 名前空間STDを使用して、 const int型MAXN = 200000 + 100。 ベクター<INT> G [MAXN]。 構造体の点{ UをINT、V。 点(= 0 INT、INT B = 0):U(A)、V(B){} }。 ブール演算子<(CONSTポイント&、constのポイント&B){ IF(AU == BU)戻りAV <BV。 auの<BU返します。 } 点p [MAXN]。 INT D [MAXN]、N、K。 int型メートル。 マップ<ポイント、整数>ミリメートル; ボイドDFS(iはFAをINT、INT、INT X) { int型NUM = G [I] .size()。 テレビで; int型CNT = 1; (INT J = 0; J <NUM; J ++)のために{ V = G [I] [J]。 (== FA V)続けるならば、 IF(CNT == x)はCNT ++。 IF(NUM <= M){ MM [ポイント(MIN(V、I)、MAX(V、I))] = CNT。 DFS(V、I、CNT); } 他{ MM [ポイント(MIN(V、I)、MAX(V、I))は] = 1。 DFS(V、I、1)。 } ++ CNT。 } } int型のmain() { CIN >> N >> K。 、B int型。 {(; iがn <I ++はint型I = 1)のための CIN >> A >> B。 IF(A> B)スワップ(B) G [A] .push_back(B)。 G [B] .push_back(A)。 D [α] - 。 D [B] - 。 P [i]は.U = A。 P [i]は.V = B。 } ソート(D、D + N)。 M = -d [K]。 M = MAX(M、1)。 INT NUM = G [1] .size()、V。 以下のために(INT i = 0; iは<NUM; iは++){ V = G [1]〜[I]。 IF(NUM <= M){ MM [ポイント(MIN(V、1)、MAX(V、1))= I + 1。 DFS(V 1、I + 1)。 } 他{ MM [ポイント(MIN(V、1)、MAX(V、1))] = 1。 DFS(V、1,1)。 } } COUT << M << ENDL。 以下のために(; iがn <I ++はI = 1 INT) COUT << MM [Pの[I]] <<」「と、 0を返します。 }