貪欲$ Poj2054 \色\ \木\ $

$ $概念

 

$説明$

各ノードは、$ A [i]が$の重み値を持つ$ 1,2,3 ... N、$ I $ $:$ $ N-ツリーノードを有し、これらのノードは、番号付けされています。

これで、すべての染色、染色ルールは、このツリーノードがあります

色に感染している必要があり、その親ノードを染めされる前に、他のノードに対して、ルートノードRは常に染色することができます。

たびに、染色のコストは$ T * A $ T $が染色され、現在の多くの時間を表している。[i]は$であり、

この木の染色の最小総コストを探しています。

 

$ソル$

 貪欲:最大のポイントで右の木は、その親ポイントダイアーの結び目の直後に染色します

何の制約ツリーを想定していない、そう思うが、シーケンス、それは明らかに降順にソート最適な染色であり、木の制約があり、できるだけ早く染色の最大重量を確認する必要があります。

最大の重みとその親ノードを染色のポイントが連続して行われるので、私たちはそれらを一緒にマージすることができますので。

Y $ $ $ X $が親ノードであることを特徴とする請求今$ X、Y、Z $ 3点の値を有し、および既知の$ X $ $ $ Y染色を連続して行った。次に、2つが存在します意思決定の種類。

次いで、1染色の$ X、Y $は、$ Z $、$ X + 2Y + 3Z = Yの+(X + Y)+ 3Z $トランスフェクト

2.先染$z$,再染$x,y, z+2x+3y=z+y+2*(x+y)$

上記の例の両方のことがわかっ共通で練習があります:$ Y $最初の答えの中に蓄積されたが、$ Y $ $ Xの$マージノードとノードは、具体的には、右のは、$ X $の値を変更するにはそれは$なぜ$(x + y)の値を変更する権利がある/ 2。$(X + Y)/ 2に$、$ yを$はノードを削除しますか?

私は[存在するノードの統合は、$ I $で、このノードは、ノードの数(および独自の合併ゴー)が含まれています。非常に重要な問題は、これら2つのアプローチのメリットを判断する方法である$ sは] $、すべての重みが関与し、[i]は$を$します。

1. $ [I] +(S [I] +1)* Z。$

2. $ zの+ [I] * 2の$

係数は、二つの方程式は、付加$ S [i]は$で、次いで$(S [I] -1)* Zの$、とを添加同時に、$ 1 $式$ Z $ $ $ 2となることがなるが見出されましたなります

1. $ [I] / sの[i]が+ 2 * Zの$

2. $ zの+ [I] / sの[i]は$

これは、既知の貪欲比較そのサイズが染色与えるかを決めることができ、前記の開始に応じて、$ [I] /秒[i]は$ A $ Z $ノードと2つのノードの重みとみなすことができます、問題は解決されます。

私は答え、初期分析のほとんどのちょうど2つの式、「$ yを蓄積するために、上記のように与えられた新しい重み値のみ、染色のオーダーのサイズを決定するために他のノードと比較するために使用することができることを強調したいです$答え「この文の中に蓄積された。特定のノードの$ J $の$の私は、接合部に蓄積$、$のANS + = A [j]と$ * S [i]に。

 

$コード$

書式#include <iostreamの> 
の#include <cstdioを>
 に#define ILインライン
 の#define Rgを登録し
 ます。#define行く(I、A、B)は(RG int型I =;私は= bを<;私は++)
 の#defineはい(I、 、b)のためには、(Rgがint型私は=; I> = B;私は++)
 の#defineデシベル倍
 の#defineは長い長いでしょ
 使用して 名前空間はstdを、
ILのINTのリード()
{ 
    int型、X = 0、Y = 1チャー C = GETCHAR()。
    一方、(C < ' 0 ' || C> ' 9 '){ もし、(C ==' - ')Y = - 1 ; C = GETCHAR();}
     一方、(C> = ' 0 ' && C <= ' 9 '){X =(X << 1)+(X << 3)+ C- ' 0 ' ; C = GETCHAR();}
     戻りのx *のY。
} 
int型【、RT、N 1001 ]、FAは[ 1001 ]、[S 1001 ]。
LL として;
INT メイン()
{ 
    // (1)しながら、
    { 
        N =)()(読み取り、RT =読み取ります。として= 0 ;
        もし(nは&& RT!)の戻り 0 ; 
        行く(I、1(読み取り= N)[i])と、S [I] = 1 
        (I、行く1、N- 1){ int型、FA [Y] = Xの=読み取る()、yは読み取ら=();} X 
        (T、行く1、N- 1 
        { 
            DB MAXS = 0int型のPOS。
            行く(I、1 、n)の
                 場合(I = RT &&!1.0 * [I] /秒[I]> = MAXS)MAXS = 1.0 * [I] / sの[i]は、POS = I;
            行く(I、1 、n)の
                 場合(FA [I] == POS)FA [I] = FA [POS]。
            + = [POS] * S [FA [POS]。
            S [FA [POS] + = S [POS]。
            [FA [POS] + = [POS]。
            [POS] = 0 ; 
        } として + = [RT]。
        printf(" %LLDする\ n "など)。
    } 戻り0 
}
        
     
コードの表示

 

 

 

おすすめ

転載: www.cnblogs.com/forward777/p/11242305.html
おすすめ