-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathHL分解.html
126 lines (106 loc) · 19.3 KB
/
HL分解.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<title>HL分解</title>
<pre>
・注意
イメージで実装した。
間違っている可能性に注意
HLのヘビーとライトが出てこないことからもお察し。
・HL分解
木をパスに分解する操作
頂点圧縮系データ構造の一つだと思う(フラワーっぽい匂いがする)
(木以外にはどう対応付けするのか分からない)
・やってること
根を設定する。(直径の端にする?)
各頂点をグループ分けする。
なるべく長い[パス]でグループに分割する。
一つの頂点は一つのグループのみに属している。
・長いパスの見つけ方
木の根を決定しているので
各頂点の深さを調べる。//bfsでもdfsでも好きなように
ついでにその頂点の親も記録しておく。//パス作成のため
根の親は[-1]とか親なし判別が出来るようにしておく。
必要な記憶
depth[頂点番号]:=頂点の深さ。根の深さは[0]
oya[頂点番号]:=頂点の根方向の頂点番号。頂点が根の場合、なし[-1]。
HukasaNext():=最も深い頂点から順に、頂点番号を得られるような何か
(深さと頂点番号をセットにして、ソート(NextIndexが必要)とか優先度つきキューとか)
・頂点をグループ分けする。
使う記憶
group[i][j]:=i番目のグループのj番目の頂点番号
groupNo[頂点番号i]:=頂点iが属するグループ番号
groupIndex[頂点番号i]:=グループでのindex位置。方向は任意?。
(根方向の頂点をindex:0にしたい。)
groupOya[グループ番号]:=グループが繋がっている根方向の頂点番号
頂点から根方向への有向辺で構成された
グラフ構造があると便利かも?親が分かっていればいらない?。
gra[u][i]:頂点uのi番目の辺が繋がっている頂点//使ってない
use[i]:=頂点iがグループ分けされている[T/F]
・手順
gropuNoNow = 0;//現在作ろうとしているグループNo
while(全部の頂点とか、調べるべき頂点がある限り続行){
v = 最も深い頂点番号;//HukasaNext()
//次回の為に、次の値が取れるようにする
//調べたい全ての頂点を調べたらループを抜ける
//分割済みならスキップ
if( use[v] ) continue;
//group[groupNoNow]の容量を確保,サイズはまだ0
group.push_back(vector<int>());//とか?
//頂点番号 && 未使用なら続行//注:評価順
while(v != -1 && use[v] != true){
//頂点[v]をグループ番号[groupNoNow]に追加
group[groupNowNow].push_back( v );
use[v] = true;//グループ分け済みにする。
v = oya[v];//vの親。根方向へ進む
}
//グループの接続先を設定
groupOya[groupNoNow] = v;
//反転させたい
//reverse(group[groupNowNow].begin(),.end());
int size = group[groupNowNow];
for(int i=0;i<size;++i){
//グループ内でのIndexと頂点番号を関連付け
groupIndex[ group[groupNoNow][i] ] = i;
}
//グループ番号を一つ増やして次に備える
groupNoNow = groupNoNow + 1;
}
・使い方
頂点uからvへのなんやかんやしたい。
TYPE result = 0;//0元
while(){
if( groupNo[u] == groupNo[v] ){
//同じグループに属している。
gNo = groupNo[u];//グループ番号
//group[gNo]
int indexL = groupIndex[u];
int indexR = groupIndex[v];
if( indexL > indexR ){
swap(indexR,indexL);
}
//一直線に並べたので、
//事前準備をすれば,配列に出来る操作ができる
//BIT,segmentTree
なんか[gNo].query(indexL,indexR);//[indexL,indexR]||[indexL,indexR+1)を処理
//resultに結果を付け加える
//終わったのでループ抜けたい
break;
}
else if( depth[ group[groupNo[u]][0] ] < depth[ group[groupNo[v]][0] ] ){
//イメージなので特に注意
//グループの先頭が深い方の頂点を根方向へ進ませる。
//u,vの深さで比べると進みすぎる場合ある。
//vを進ませる
gNo = groupNo[v];//グループ番号
//uは同じグループでないので
//根方向へ残りのグループ内全部。
int indexL = 0;
int indexR = groupIndex[v];
なんか[gNo].query(indexL,indexR);//[indexL,indexR]を処理
//resulutに結果を付け加える。
v = groupOya[gNo];//グループの接続先の頂点
}else{
//else if( depth[u] < depth[v] ){}と同じようなことやる
}
}
A*B!=B*Aの演算なら、順序に注意して実装しないといけない。
</pre>
<img src="data:image/png;base64,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" />