$説明$
各ノードは、$ 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 = 0。int型の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 。 }