[構成、貪欲] Treelandにおける道路のcf1141G、民営化

問題の意味

あなたの側無根木の数を与え、それぞれの側号をマークにするには、接続された各ポイントの要件を繰り返すことができます。

今、あなたはいくつかのポイントの要件を無視することができ、あなたの「割引」を与えるために

あなたは最小限にどのように多くの番号を尋ねます

このツリーのうちの出力

問題の解決策

その後、最高度の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を返します。
}

おすすめ

転載: blog.csdn.net/wang_viscaria/article/details/92669479