DFSための研究ノート

定義し、理解して1:

配列は、ツリー構造は、直鎖構造に注文することができるときに発生木のシーケンススタンプDFS深さ優先トラバーサルであるので、線形問題ツリーに問題

この時、私たちは木問題に対処するので、簡単なメンテナンス間隔のセグメントツリー、ツリーアレイ、として良いデータ構造の多くを使用してすることができます!

2.重要プロパティ

(1)[X]表す第一のタイムスタンプDFS Xノード、アウト[X]はに対応するタイムスタンプを表し、出口ノードx時間からタイムスタンプ、NUM [時間]を表しに設けられています

どのツリーノードです。特徴は、配列は、取得した私たちの新しいシーケンスは線状配列ノードたNUM DFSです。

明らかに、ルート・サブツリーにノードXは、必ずしも連続した区間を占める[[x]の中で[X]、およびこの間隔風雲内のすべてのノードはじめにDFSにおける全てのサブサブツリーノード。

コード:

 

DFSの空隙(U int型、INT FA)
{
[U] = CNT ++で、//は、xにタイムスタンプを記録する
[CNT] = U DFS; //更新シーケンスは、DFS
INT Vを; //
(INTのために私はヘッド= [U]; I; Iは= E [I] .next)
{
V = E [I] .TO;
IF(V = FA)!
のDFS(V、U); //検索サブツリー
}
OUT [U] = ++ CNT; x軸から//レコードのタイムスタンプ
DFS [CNT] = U; //更新シーケンスDFS
}

(2)一つの問題:変形の一点、及びサブツリークエリ:

DFSは直接ノードX対応DFS上の一点にシーケンス値は、サブツリーと要求間隔を変更して、ツリーまたは配列セグメントツリーメンテナンスをすることができる検討され、ツリー全体の配列を決定しました!

第二の問題:ツリー鎖修飾、問い合わせのシングルポイント:

そのようなプラス全てとして(U、V)ノードの間の修正値

だから我々は動作するように4つの鎖は考えます!

考虑のu --->ルート、V --->ルート、LCA(U、V)--->ルート、FA(LCA紫外線(UV))--->ルート!

我々は、すべてのフロント二つの経路上の点、すべての二つの経路のマイナスポイントを追加します

このツリーは、配列DFSの配列に対応する各ノードに順次重みに対応する、配列DFS配列を維持するために使用することができます!

その後、修正?フェンウィックツリーは、実際の順序とプレフィックスDFSの重量によって維持されています!

get_sum(x)は、差動プレフィックス1-Xを表します

(L [U])を追加し、(L [V])を追加し、(LCA(U、V)、 - )を追加し、追加(FA(LCA(U、V))を - );

ヴァル(X)= get_sum(R [X]) - get_sum(L [X] -1)。

質問3:重量サブツリーは、全体的なだけでなく、単一の点として、重みのルートに、クエリの一点を修正し、

例えば、我々は、サブツリーのルートに加えて全体にノードをxは

我々は、すべてのノードは、2つの値を維持します

これはタグであり、他のノードの自重です。

我々は2つの動作モードを提供します。

1)単一の点を直接変更します

2)Xプラス全体をルートとするサブツリーであろう

操作1、増加すべての点、タグ+ =、そのノード自身の重量のために操作2の一点への直接修飾、 - (DEP [X] -1)*; Xとしてこれを打ち消すためにありませんルート

サブツリーノード内に貢献!ルートに重みとノードyを掲載し、我々は返さ:タグ* DEP [Y] + valの[Y];

その後、操作をすることができます!

例:POJ3321  https://www.cnblogs.com/shenben/p/5764932.html

羅区:P3178ツリー操作

 

 

 

 

おすすめ

転載: www.cnblogs.com/little-cute-hjr/p/11832278.html