]> mj.ucw.cz Git - saga.git/blob - dyn.tex
5a7a8793fa28960fbdc689328297ad72d556f695
[saga.git] / dyn.tex
1 \ifx\endpart\undefined
2 \input macros.tex
3 \fi
4
5 \chapter{Dynamic Spanning Trees}\id{dynchap}%
6
7 \section{Dynamic graph algorithms}
8
9 In many applications, we often need to solve a~certain graph problem for a~sequence of graphs that
10 differ only a~little, so recomputing the solution for every graph from scratch would be a~waste of
11 time. In such cases, we usually turn our attention to \df{dynamic graph algorithms.} A~dynamic
12 algorithm is in fact a~data structure that remembers a~graph. It offers operations that modify the
13 structure of the graph and also operations that query the result of the problem for the current
14 state of the graph. A~typical example of a~problem of this kind is dynamic maintenance of connected
15 components:
16
17 \problemn{Dynamic connectivity}
18 Maintain an~undirected graph under a~sequence of the following operations:
19 \itemize\ibull
20 \:$\<Init>(n)$ --- Create a~graph with $n$~isolated vertices $\{1,\ldots,n\}$.\foot{%
21 The structure could support dynamic addition and removal of vertices, too,
22 but this is easy to add and infrequently used, so we will rather keep the set
23 of vertices fixed for clarity.}
24 \:$\<Insert>(G,u,v)$ --- Insert an~edge $uv$ to~$G$ and return its unique
25 identifier. This assumes that the edge did not exist yet.
26 \:$\<Delete>(G,e)$ --- Delete an~edge specified by its identifier from~$G$.
27 \:$\<Connected>(G,u,v)$ --- Test if vertices $u$ and~$v$ are in the same connected component of~$G$.
28 \endlist
29
30 \para
31 We have already encountered a~special case of dynamic connectivity when implementing the
32 Kruskal's algorithm in Section \ref{classalg}. At that time, we did not need to delete
33 any edges from the graph, which makes the problem substantially easier. This special
34 case is customarily called an~\df{incremental} or \df{semidynamic} graph algorithm.
35 We mentioned the Disjoint Set Union data structure of Tarjan and van Leeuwen (Theorem \ref{dfu})
36 which can be used for that: Connected components are represented by equivalence classes.
37 Queries on connectedness translate to \<Find>, edge insertions to \<Find>
38 followed by \<Union> if the new edge joins two different components. This way,
39 a~sequence of $m$~operations starting with an~empty graph on $n$~vertices is
40 processed in time $\O(n+m\timesalpha(m,n))$ and this holds even for the Pointer
41 Machine. Fredman and Saks \cite{fredman:cellprobe} have proven a~matching lower
42 bound in the cell-probe model which is stronger than RAM with $\O(\log n)$-bit
43 words.
44
45 In this chapter, we will focus on the dynamic version of the minimum spanning forest.
46 This problem seems to be intimately related to the dynamic connectivity. Indeed, all known
47 algorithms for dynamic connectivity maintain some sort of a~spanning forest. For example, in the
48 incremental algorithm we have just mentioned, this forest is formed by the edges that have
49 triggered the \<Union>s. This suggests that a~dynamic MSF algorithm could be obtained by modifying
50 the mechanism to keep the forest minimum. This will indeed turn out to be true, although we cannot
51 be sure that it will lead to the most efficient solution possible --- as of now, the known lower
52 bounds are very far.
53
54 Incremental MST will be easy to achieve even in the few pages of this section, but making it fully
55 dynamic will require more effort, so we will review some of the required building blocks before
56 going into that.
57
58 We however have to answer one important question first: What should be the output of
59 our MSF data structure? Adding an~operation that would return the MSF of the current
60 graph is of course possible, but somewhat impractical as this operation has to
61 spend $\Omega(n)$ time on the mere writing of its output. A~better way seems to
62 be making the \<Insert> and \<Delete> operations report the list of modifications
63 of the MSF implied by the change in the graph.
64
65 Let us see what happens when we \<Insert> an~edge~$e$ to a~graph~$G$ with its minimum spanning
66 forest~$F$, obtaining a~new graph~$G'$ with its MSF~$F'$. If $e$~connects two components of~$G$ (and
67 therefore also of~$F$), we have to add~$e$ to~$F$. Otherwise, one of the following cases happens:
68 Either $e$~is $F$-heavy and so the forest~$F$ is also the MSF of the new graph. Or it is $F$-light
69 and we have to modify~$F$ by exchanging the heaviest edge~$f$ of the path $F[e]$ with~$e$.
70
71 Correctness of the former case follows immediately from the Theorem on Minimality by order
72 (\ref{mstthm}), because any $F'$-light would be also $F$-light, which is impossible as $F$~was
73 minimum. In the latter case, the edge~$f$ is not contained in~$F'$ because it is the heaviest
74 on the cycle $F[e]+e$ (by the Red lemma, \ref{redlemma}). We can now use the Blue lemma
75 (\ref{bluelemma}) to prove that it should be replaced with~$e$. Consider the tree~$T$
76 of~$F$ that contains both endpoints of the edge~$e$. When we remove~$f$ from~$F$, this tree falls
77 apart to two components $T_1$ and~$T_2$. The edge~$f$ was the lightest in the cut~$\delta_G(T_1)$
78 and $e$~is lighter than~$f$, so $e$~is the lightest in~$\delta_{G'}(T_1)$ and hence $e\in F'$.
79
80 A~\<Delete> of an~edge that is not contained in~$F$ does not change~$F$. When we delete
81 an~MSF edge, we have to reconnect~$F$ by choosing the lightest edge of the cut separating
82 the new components (again the Blue lemma in action). If there is no such
83 replacement edge, we have deleted a~bridge, so the MSF has to remain
84 disconnected.
85
86 The idea of reporting differences in the MSF indeed works very well. We can summarize
87 what we have shown in the following lemma and use it to define the dynamic MSF.
88
89 \lemma
90 An~\<Insert> or \<Delete> of an~edge in~$G$ causes at most one edge addition, edge
91 removal or edge exchange in $\msf(G)$.
92
93 \problemn{Dynamic minimum spanning forest}
94 Maintain an~undirected graph with distinct weights on edges (drawn from a~totally ordered set)
95 and its minimum spanning forest under a~sequence of the following operations:
96 \itemize\ibull
97 \:$\<Init>(n)$ --- Create a~graph with $n$~isolated vertices $\{1,\ldots,n\}$.
98 \:$\<Insert>(G,u,v)$ --- Insert an~edge $uv$ to~$G$. Return its unique
99         identifier and the list of additions and deletions of edges in $\msf(G)$.
100 \:$\<Delete>(G,e)$ --- Delete an~edge specified by its identifier from~$G$.
101         Return the list of additions and deletions of edges in $\msf(G)$.
102 \endlist
103
104 \paran{Incremental MSF}%
105 To obtain an~incremental MSF algorithm, we need to keep the forest in a~data structure that
106 supports search for the heaviest edge on the path connecting a~given pair
107 of vertices. This can be handled efficiently by the Link-Cut trees of Sleator and Tarjan:
108
109 \thmn{Link-Cut Trees, Sleator and Tarjan \cite{sleator:trees}}\id{sletar}%
110 There is a~data structure that represents a~forest of rooted trees on~$n$ vertices.
111 Each edge of the forest has a~weight drawn from a~totally ordered set. The structure
112 supports the following operations in time $\O(\log n)$ amortized:\foot{%
113 The Link-Cut trees can offer a~plethora of other operations, but we do not mention them
114 as they are not needed in our application.}
115 \itemize\ibull
116 \:$\<Parent>(v)$ --- Return the parent of~$v$ in its tree or \<null> if $v$~is a~root.
117 \:$\<Root>(v)$ --- Return the root of the tree containing~$v$.
118 \:$\<Weight>(v)$ --- Return the weight of the edge $(\<Parent(v)>,v)$.
119 \:$\<PathMax>(v)$ --- Return the vertex~$w$ closest to $\<Root>(v)$ such that the edge
120         $(\<Parent>(w),w)$ is the heaviest of those on the path from the root to~$v$.
121         If more edges have the maximum weight, break the tie arbitrarily.
122         If there is no such edge ($v$~is the root itself), return \<null>.
123 \:$\<Link>(u,v,x)$ --- Connect the trees containing $u$ and~$v$ by an~edge $(u,v)$ of
124         weight~$x$. Assumes that $v~$is a tree root and $u$~lies in a~different tree.
125 \:$\<Cut>(v)$ --- Split the tree containing the non-root vertex $v$ to two trees by
126         removing the edge $(\<Parent>(v),v)$. Returns the weight of this edge.
127 \:$\<Evert>(v)$ --- Modify the orientations of edges to make~$v$ the root of its tree.
128 \endlist
129
130 %% \>Additionally, all edges on the path from~$v$ to $\<Root>(v)$ can be enumerated in
131 %% time $\O(\ell + \log n)$, where $\ell$~is the length of that path. This operation
132 %% (and also the path itself) is called $\<Path>(v)$.
133 %% 
134 %% \>If the weights are real numbers (or in general an~arbitrary group), the $\O(\log n)$
135 %% operations also include:
136 %% 
137 %% \itemize\ibull
138 %% \:$\<PathWeight>(v)$ --- Return the sum of the weights on $\<Path>(v)$.
139 %% \:$\<PathUpdate>(v,x)$ --- Add~$x$ to the weights of all edges on $\<Path>(v)$.
140 %% \endlist
141
142 \proof
143 See \cite{sleator:trees}.
144 \qed
145
146 Once we have this structure, we can turn our ideas on updating of the MSF to
147 an~incremental algorithm:
148
149 \algn{\<Insert> in an~incremental MSF}
150 \algo
151 \algin A~graph~$G$ with its MSF $F$ represented as a~Link-Cut forest, an~edge~$uv$
152 with weight~$w$ to be inserted.
153 \:$\<Evert>(u)$. \cmt{$u$~is now the root of its tree.}
154 \:If $\<Root>(v) \ne u$: \cmt{$u$~and~$v$ lie in different trees.}
155 \::$\<Link>(v,u,w)$. \cmt{Connect the trees.}
156 \::Return ``$uv$ added''.
157 \:Otherwise: \cmt{both are in the same tree}
158 \::$y\=\<PathMax>(v)$.
159 \::$x\=\<Parent>(y)$.  \cmt{Edge~$xy$ is the heaviest on $F[uv]$.}
160 \::If $\<Weight>(y) > w$: \cmt{We have to exchange~$xy$ with~$uv$.}
161 \:::$\<Cut>(y)$, $\<Evert>(v)$, $\<Link>(u,v,w)$.
162 \:::Return ``$uv$~added, $xy$~removed''.
163 \::Otherwise return ``no changes''.
164 \algout The list of changes in~$F$.
165 \endalgo
166
167 \thmn{Incremental MSF}
168 When only edge insertions are allowed, the dynamic MSF can be maintained in time $\O(\log n)$
169 amortized per operation.
170
171 \proof
172 Every \<Insert> performs $\O(1)$ operations on the Link-Cut forest, which take
173 $\O(\log n)$ each by Theorem \ref{sletar}.
174 \qed
175
176 \rem
177 We can easily extend the semidynamic MSF algorithm to allow an~operation commonly called
178 \<Backtrack> --- removal of the most recently inserted edge. It is sufficient to keep the
179 history of all MSF changes in a~stack and reverse the most recent change upon backtrack.
180
181 What are the obstacles to making the structure fully dynamic?
182 Deletion of edges that do not belong to the MSF is trivial (we do not
183 need to change anything) and so is deletion of bridges (we just remove the bridge
184 from the Link-Cut tree, knowing that there is no edge to replace it). The hard part
185 is the search for replacement edges after an~edge belonging to the MSF is deleted.
186
187 This very problem also has to be solved by algorithms for fully dynamic connectivity,
188 we will take a~look on them first.
189
190 %--------------------------------------------------------------------------------
191
192 \section{Eulerian Tour trees}
193
194 An~important stop on the road to fully dynamic algorithms has the name \df{Eulerian Tour trees} or
195 simply \df{ET-trees}. It is a~representation of forests introduced by Henzinger and King
196 \cite{henzinger:randdyn} in their randomized dynamic algorithms. It is similar to the Link-Cut
197 trees, but it is much simpler and instead of path operations it offers efficient operations on
198 subtrees. It is also possible to attach auxiliary data to vertices and edges of the original tree.
199
200 \defn\id{eulseq}%
201 The \df{Eulerian Tour sequence} $\Eul(T)$ of a~rooted tree~$T$ is the sequence of vertices of~$T$ as visited
202 by the depth-first traversal of~$T$. More precisely, it is generated by the following algorithm $\<ET>(v)$
203 when it is invoked on the root of the tree:
204 \algo
205 \:Record~$v$ in the sequence.
206 \:For each son~$w$ of~$v$:
207 \::Call $\<ET>(w)$ recursively.
208 \::Record~$w$.
209 \endalgo
210 \>One of the occurrences of each vertex is defined as its \df{active occurrence} and it will
211 be used to store auxiliary data associated with the vertex.
212
213 \obs
214 The ET-sequence contains a~vertex of degree~$d$ exactly $d$~times except for the root which
215 occurs $d+1$ times. The whole sequence therefore contains $2n-1$ elements. It indeed describes the
216 order vertices on an~Eulerian tour in the tree with all edges doubled. Let us observe what happens
217 to the ET-sequence when we modify the tree.
218
219 When we \em{delete} an~edge $uv$ from the tree~$T$ (let $u$~be the parent of~$v$), the sequence
220 $\Eul(T) = AuvBvuC$ (with no~$u$ nor~$v$ in~$B$) splits to two ET-sequences $AuC$ and $vBv$.
221 If there was only a~single occurrence of~$v$, it corresponded to a~leaf and thus the second
222 sequence should consist of $v$~alone.
223
224 \em{Changing the root} of the tree~$T$ from~$v$ to~$w$ changes $\Eul(T)$ from $vAwBwCv$ to $wBwCvAw$.
225 If $w$~was a~leaf, the sequence changes from $vAwCv$ to $wCvAw$. If $vw$ was the only edge of~$T$,
226 the sequence $vw$ becomes $wv$. Note that this works regardless of the presence of~$w$ inside~$B$.
227
228 \em{Joining} the roots of two trees by a~new edge makes their ET-sequences $vAv$ and~$wBw$
229 combine to $vAvwBwv$. Again, we have to handle the cases when $v$ or~$w$ has degree~1 separately:
230 $v$~and~$wBw$ combine to $vwBwv$, and $v$~with~$w$ makes $vwv$.
231
232 \float{\valign{\vfil#\vfil\cr
233 \hbox{\epsfbox{pic/ettree.eps}}\cr
234 \noalign{\qquad\quad}
235   \halign{#\hfil\cr
236     $\Eul(T_1) = 0121034546474308980$,~~$\Eul(T_2) = aba$. \cr
237     $\Eul(T_1-34) = 01210308980, 4546474$. \cr
238     $\Eul(T_1\hbox{~rooted at~3}) = 3454647430898012103$. \cr
239     $\Eul(T_1+0a+T_2)$: $0121034546474308980aba0$. \cr
240   }\cr
241 }}{Trees and their ET-sequences}
242
243 If any of the occurrences that we have removed from the sequence was active, there is always
244 a~new occurrence of the same vertex that can stand in its place and inherit the auxiliary data.
245
246 The ET-trees will represent the ET-sequences by $(a,b)$-trees with the parameter~$a$ set upon
247 initialization of the structure and with $b=2a$. We know from the standard theorems of $(a,b)$-trees
248 (see for example \cite{clrs}) that the depth of a~tree with $n$~leaves is always $\O(\log_a n)$
249 and that all basic operations including insertion, deletion, search, splitting and joining the trees
250 run in time $\O(a\log_a n)$ in the worst case.
251
252 We will use the ET-trees to maintain a~spanning forest of the current graph. The auxiliary data of
253 each vertex will hold a~list of edges incident with the given vertex, which do not lie in the
254 forest. Such edges are usually called the \df{non-tree edges.}
255
256 \defn
257 \df{Eulerian Tour trees} are a~data structure that represents a~forest of trees and a~set of non-tree
258 edges associated with the vertices of the forest. To avoid confusion, we will distinguish between
259 \df{original} vertices and edges (of the original trees) and the vertices and edges of the
260 data structure. The structure consists of:
261 \itemize\ibull
262 \:A~collection of $(a,b)$-trees with some fixed parameters $a$ and~$b$.
263         Each such tree corresponds to one of the original trees~$T$. Its
264         leaves (in the usual tree order) correspond to the elements
265         of the ET-sequence $\Eul(T)$. Each two consecutive leaves $u$ and~$v$ are separated
266         by a~unique key stored in an~internal vertex of the $(a,b)$-tree. This key is used to represent
267         the original edge~$uv$. Each original edge is therefore kept in both its orientations.
268 \:A~mapping $\<act>(v)$ that maps each original vertex to the leaf containing its active occurrence.
269 \:A~mapping $\<edge>(e)$ that maps an~original edge~$e$ to one of the internal keys representing it.
270 \:A~mapping $\<twin>(k)$ that maps an~internal key~$k$ to the other internal key of the same
271         original edge.
272 \:A~list of non-tree edges placed in each leaf. The lists are allowed to be non-empty only
273         in the leaves that represent active occurrences of original vertices.
274 \:Boolean \df{markers} in the internal vertices that signal presence of a~non-tree
275         edge anywhere in the subtree rooted at that internal vertex.
276 \:Counters $\<leaves>(v)$ that contain the number of leaves in the subtree rooted at~$v$.
277 \endlist
278 \>The structure supports the following operations on the original trees:
279 \itemize\ibull
280 \:\<Create> --- Create a~single-vertex tree.
281 \:$\<Link>(u,v)$ --- Join two different trees by an~edge~$uv$ and return a~unique identifier
282         of this edge.
283 \:$\<Cut>(e)$ --- Split a~tree by removing the edge~$e$ given by its identifier.
284 \:$\<Root>(v)$ --- Return the root of the ET-tree containing the vertex~$v$. This can be used
285         to test whether two vertices lie in the same tree. However, the root is not guaranteed
286         to stay the same when the tree is modified by a~\<Link> or \<Cut>.
287 \:$\<Size>(v)$ --- Return the number of vertices in the tree containing the vertex~$v$.
288 \:$\<InsertNontree>(v,e)$ --- Add a~non-tree edge~$e$ to the list at~$v$ and return a~unique
289         identifier of this edge.
290 \:$\<DeleteNontree>(e)$ --- Delete a~non-tree edge~$e$ given by its identifier.
291 \:$\<ScanNontree>(v)$ --- Return non-tree edges stored in the same tree as~$v$.
292 \endlist
293 \>If the non-tree edges have weights, 
294
295 \impl
296 We will implement the operations on the ET-trees by translating the intended changes of the
297 ET-sequences to operations on the $(a,b)$-trees. The role of identifiers of the original vertices
298 and edges will be of course played by pointers to the respective leaves and internal keys of
299 the $(a,b)$-trees.
300
301 \<Cut> of an~edge splits the $(a,b)$-tree at both internal keys representing the given edge
302 and joins them back in the different order.
303
304 \<Link> of two trees can be accomplished by making both vertices the roots of their trees first
305 and joining the roots by an~edge afterwards. Re-rooting again involves splits and joins of $(a,b)$-trees.
306 As we can split at any occurrence of the new root vertex, we will use the active occurrence
307 which we remember. Joining of the roots translated to joining of the $(a,b)$-trees.
308
309 \<Root> just follows parent pointers in the $(a,b)$-tree and it walks the path from the leaf
310 to the root.
311
312 \<Size> finds the root and returns its counter.
313
314 \<InsertNontree> finds the leaf $\<act>(v)$ containing the list of $v$'s non-tree edges
315 and inserts the new edge there. The returned identifier will consist from the pointer to
316 the edge and the vertex in whose list it is stored. Then we have to recalculate the markers
317 on the path from $\<act>(v)$ to the root. \<DeleteNontree> is analogous.
318
319 Whenever any other operation changes a~vertex of the tree, it will also update its marker and
320 counter and, if necessary, the markers and counters on the path to the root.
321
322 \<ScanNontree> traverses the tree recursively from the root, but it does not enter the
323 subtrees whose roots are not marked.
324
325 Analysis of the time complexity is now straightforward:
326
327 \thmn{Eulerian Tour trees, Henzinger and Rauch \cite{henzinger:randdyn}}\id{etthm}%
328 The ET-trees perform the operations \<Link> and \<Cut> in time $\O(a\log_a n)$, \<Create>
329 in $\O(1)$, \<Root>, \<InsertNontree>, and \<DeleteNontree> in $\O(\log_a n)$, and
330 \<ScanNontree> in $\O(a\log_a n)$ per edge reported. Here $n$~is the number of vertices
331 in the original forest and $a\ge 2$ is an~arbitrary constant.
332
333 \proof
334 We set $b=2a$. Our implementation performs $\O(1)$ operations on the $(a,b)$-trees
335 per operation on the ET-tree, plus $\O(1)$ other operations. We apply the standard theorems
336 on the complexity of $(a,b)$-trees \cite{clrs}.
337 \qed
338
339 \examplen{Connectivity acceleration}\id{accel}%
340 In most cases, the ET-trees are used with $a$~constant, but sometimes choosing~$a$ as a~function
341 of~$n$ can also have its beauty. Suppose that there is a~data structure which maintains an~arbitrary
342 spanning forest of a~dynamic graph. Suppose also that the structure works in time $\O(\log^k n)$
343 per operation and that it reports $\O(1)$ changes in the spanning forest for every change
344 in the graph. If we keep the spanning forest in ET-trees with $a=\log n$, the updates of the
345 data structure cost an~extra $\O(\log^2 n / \log\log n)$, but queries accelerate to $\O(\log
346 n/\log\log n)$.
347
348 \paran{ET-trees with weights}
349 In some cases, we will also need to represent weighted graphs and enumerate the non-tree
350 edges in order of their increasing weights (in fact, it will be sufficient to find the
351 lightest one, remove it and iterate). This can be handled by a~minute modification of the
352 ET-trees.
353
354 The tree edges will remember their weight in the corresponding internal keys of the ET-tree.
355 We replace each list of non-tree edges by an~$(a,b)$-tree keeping the edges sorted by weight.
356 We also store the minimum element of the tree separately, so that it can be accessed in constant
357 time. The boolean \em{marker} will then become the minimum weight of a~non-tree edge attached to the
358 particular subtree, which can be recalculated as easy as the markers can. Searching for the
359 lightest non-tree edge then just follows the modified markers.
360
361 The time complexities of all operations therefore remain the same, with a~possible
362 exception of the operations on non-tree edges, to which we have added the burden of
363 updating the new $(a,b)$-trees. This however consists of $\O(1)$ updates per a~single
364 call to \<InsertNontree> or \<DeleteNontree>, which takes $\O(a\log_a n)$ time only.
365 We can therefore conclude:
366
367 \corn{Weighted ET-trees}\id{wtet}%
368 The time bounds in Theorem \ref{etthm} hold for the weighted ET-trees, too.
369
370
371 %--------------------------------------------------------------------------------
372
373 \section{Dynamic connectivity}
374
375 The fully dynamic connectivity problem has a~long and rich history. In the 1980's, Frederickson \cite{frederickson:dynamic}
376 has used his topological trees to construct a~dynamic connectivity algorithm of complexity $\O(\sqrt m)$ per update
377 $\O(1)$ per query. Eppstein et al.~\cite{eppstein:sparsify} have introduced a~sparsification technique which can bring the
378 updates down to $\O(\sqrt n)$. Later, several different algorithms with complexity on the order of $n^\varepsilon$
379 were presented by Henzinger and King \cite{henzinger:mst} and also by Mare\v{s} \cite{mares:dga}.
380 A~polylogarithmic time bound was first reached by the randomized algorithm of Henzinger and King \cite{henzinger:randdyn}.
381 The best result known as of now is the $\O(\log^2 n)$ time deterministic algorithm by Holm,
382 de~Lichtenberg and Thorup \cite{holm:polylog}, which will we describe in this section.
383
384 The algorithm will maintain a~spanning forest~$F$ of the current graph~$G$, represented by an~ET-tree
385 which will be used to answer connectivity queries. The edges of~$G\setminus F$ will be stored as~non-tree
386 edges in the ET-tree. Hence, an~insertion of an~edge to~$G$ either adds it to~$F$ or inserts it as non-tree.
387 Deletions of non-tree edges are also easy, but when a~tree edge is deleted, we have to search for its
388 replacement among the non-tree edges.
389
390 To govern the search in an~efficient way, we will associate each edge~$e$ with a~level $\ell(e) \le
391 L = \lfloor\log_2 n\rfloor$. For each level~$i$, we will use~$F_i$ to denote the subforest
392 of~$F$ containing edges of level at least~$i$. Therefore $F=F_0 \supseteq F_1 \supseteq \ldots \supseteq F_L$.
393 We will maintain the following \em{invariants:}
394
395 {\narrower
396 \def\iinv{{\bo I\the\itemcount~}}
397 \numlist\iinv
398 \:$F$~is the maximum spanning forest of~$G$ with respect to the levels. In other words,
399 if $uv$ is a~non-tree edge, then $u$ and~$v$ are connected in~$F_{\ell(uw)}$.
400 \:For each~$i$, the components of~$F_i$ have at most $\lfloor n/2^i \rfloor$ vertices.
401 This implies that all~$F_i$ for $i>L$ are empty.
402 \endlist
403 }
404
405 At the beginning, the graph contains no edges, so both invariants are trivially
406 satistifed. Newly inserted edges can enter level~0, which cannot break I1 nor~I2.
407
408 When we delete a~tree edge at level~$\ell$, we split a~tree~$T$ of~$F_\ell$ to two
409 trees $T_1$ and~$T_2$. Without loss of generality, let us assume that $T_1$ is the
410 smaller one. We will try to find the replacement edge of the highest possible
411 level that connects them back. From I1, we know that such an~edge cannot belong to
412 level greater than~$\ell$, so we start looking for it at level~$\ell$. According
413 to~I2, the tree~$T$ had at most $\lfloor n/2^\ell\rfloor$ vertices, so $T_1$ has
414 at most $\lfloor n/2^{\ell+1} \rfloor$ of them. Thus we can increase the levels
415 of all edges of~$T_1$ without violating either invariant.
416
417 We now start enumerating the non-tree edges incident with~$T_1$. For each such edge,
418 we test whether its other endpoint lies in~$T_2$. If it does, we have found the replacement
419 edge and we insert it to~$F_\ell$. Otherwise we move the edge one level up. (This will
420 be the gist of our amortization argument: We can charge most of the work on level
421 increases and we know that the level of each edge can reach at most~$L$.)
422
423 If the non-tree edges at level~$\ell$ are exhausted, we try the same in the next
424 lower level and so on. If there is no replacement edge on level~0, the tree~$T$
425 remains disconnected.
426
427 \impl
428 We will use a~single ET-tree with~$a$ set to~2 for each level. For the $i$-th level, the ET-tree
429 ${\cal E}_i$ will represent the forest~$F_i$ and the non-tree edges of
430 level~$i$ will be attached to its vertices.
431
432 \algn{Insertion of an~edge}
433 \algo
434 \algin An~edge $uv$ to insert.
435 \:$\ell(uv) \= 0$.
436 \:Ask the ET-tree ${\cal E}_0$ if $u$ and~$v$ are in the same component. If they are:
437 \::Add $uv$ to the list of non-tree edges in ${\cal E}_0$ at both $u$ and~$v$.
438 \:Otherwise:
439 \::Add $uv$ to~$F_0$.
440 \endalgo
441
442 \algn{Deletion of an~edge}
443 \algo
444 \algin An~edge $uv$ to delete.
445 \:$\ell \= \ell(uv)$.
446 \:If $uv$ is a~non-tree edge:
447 \::Remove $uv$ from the lists of non-tree edges at both $u$ and~$v$ in~${\cal E}_{\ell}$.
448 \:Otherwise:
449 \::Remove $uv$ from~$F_\ell$.
450 \::Call $\<Replace>(uv,\ell)$.
451 \endalgo
452
453 \algn{$\<Replace>(uv,i)$ -- Search for an~replacement edge for~$uv$ at level~$i$}
454 \algo
455 \:Let $T_1$ and~$T_2$ be the trees in~$F_i$ containing $u$ and~$v$ respectively.
456 \:If $n(T_1) > n(T_2)$, swap $T_1$ with~$T_2$.
457 \:Move all level~$i$ edges in~$T_1$ to level~$i+1$ and insert them to~${\cal E}_{i+1}$.
458 \:Enumerate non-tree edges incident with vertices of~$T_1$ and stored in ${\cal E}_i$.
459   For each edge~$xy$, $x\in T_1$, do:
460 \::If $y\in T_2$, add the edge $xy$ to~$F_i$ and return.
461 \::Otherwise increase $\ell(xy)$ by one. This includes deleting~$xy$ from~${\cal E}_i$
462   and inserting it to~${\cal E}_{i+1}$.
463 \:If $i>0$, call $\<Replace>(xy,i-1)$.
464 \endalgo
465
466 \>Analysis of the time complexity is straightforward:
467
468 \thmn{Fully dynamic connectivity, Holm et al.~\cite{holm:polylog}}\id{dyncon}%
469 Dynamic connectivity can be maintained in time $\O(\log^2 n)$ amortized for both
470 \<Insert> and \<Delete> and in time $\O(\log n/\log\log n)$ per \<Connected>
471 in the worst case.
472
473 \proof
474 The direct cost of an~\<Insert> is $\O(\log n)$ for the operations on the ET-trees
475 (by Theorem \ref{etthm}). We will have it pre-pay all level increases of the new
476 edge. Since the levels never decrease, each edge can be brought a~level up at most
477 $L=\lfloor\log n\rfloor$ times. Every increase costs $\O(\log n)$ on the ET-tree
478 operations, so we pay $\O(\log^2 n)$ for all of them.
479
480 A~\<Delete> costs $\O(\log^2 n)$ directly, as we might have to update all~$L$
481 ET-trees. Additionally, we call \<Replace> up to $L$ times. The initialization of
482 \<Replace> costs $\O(\log n)$ per call, the rest is paid for by the edge level
483 increases.
484
485 To bring the complexity of \<Connected> from $\O(\log n)$ down to $\O(\log n/\log\log n)$,
486 we apply the trick from Example \ref{accel} and store~$F_0$ in a~ET-tree with $a=\max(\lfloor\log n\rfloor,2)$.
487 This does not hurt the complexity of insertions and deletions, but allows for faster queries.
488 \qed
489
490 %--------------------------------------------------------------------------------
491
492 \section{Dynamic MSF}
493
494 Most of the early algorithms for dynamic connectivity also imply $\O(n^\varepsilon)$
495 algorithms for dynamic maintenance of the MSF. Henzinger and King \cite{henzinger:twoec,henzinger:randdyn}
496 have generalized their randomized connectivity algorithm to maintain the MSF in $\O(\log^5 n)$ time per
497 operation, or $\O(k\log^3 n)$ if only~$k$ different values of edge weights are allowed. They have solved
498 the decremental version of the problem first (which starts with a~given graph and only edge deletions
499 are allowed) and then presented a~general reduction from the fully dynamic MSF to its decremental version.
500 We will describe the algorithm of Holm, de Lichtenberg and Thorup \cite{holm:polylog}, who have followed
501 the same path. They have modified their dynamic connectivity algorithm to solve the decremental MSF
502 in $\O(\log^2 n)$ and obtained the fully dynamic MSF working in $\O(\log^4 n)$ per operation.
503
504 \paran{Decremental MSF}%
505 Turning the algorithm from the previous section to decremental MSF requires only two
506 changes: First, we have to start with the forest~$F$ equal to the MSF of the initial
507 graph. As we require to pay $\O(\log^2 n)$ for every insertion, we can use almost arbitrary
508 MSF algorithm to find~$F$. Second, when we search for an~replacement edge, we need to pick
509 the lightest possible choice. We will therefore use the weighted version of the ET-trees (Corollary \ref{wtet})
510 and try the lightest non-tree edge incident with the examined tree first. We must ensure
511 that the lower levels cannot contain a~lighter replacement edge, but fortunately the
512 light edges tend to ``bubble up'' in the hierarchy of levels. This can be formalized as
513 the following invariant:
514
515 {\narrower
516 \def\iinv{{\bo I\the\itemcount~}}
517 \numlist\iinv
518 \itemcount=2
519 \:On every cycle, the heaviest edge has the smallest level.
520 \endlist
521 }
522
523 \>This easily implies that we select the right replacement edge:
524
525 \lemma\id{msfrepl}%
526 Let $F$~be the minimum spanning forest and $e$ any its edge. Then among all replacement
527 edges for~$e$, the lightest one is on the maximum level.
528
529 \proof
530 Let us consider any two edges $f_1$ and~$f_2$ replacing~$e$. By minimality of~$F$ and the Cycle
531 rule (\ref{cyclerule}), each $f_i$ is the heaviest edge on the cycle~$C_i = F[f_i] + f_i$.
532 In a~moment, we will show that the symmetric difference~$C$ of these two cycles is again a~cycle.
533 This implies that if $f_1$ is heavier than~$f_2$, then by I3 $f_1$~is the heaviest edge on~$C$, so
534 $\ell(f_1) \le \ell(f_2)$. Therefore the lightest of all replacement edges must have
535 the maximum level.
536
537 Why is~$C$ a~cycle:
538 Let $F^a$ and~$F^b$ be the trees of~$F-e$ in which the endpoints of~$e$ lie, and for
539 every edge~$g$ between $F^a$ and~$F^b$ let $g^a$ and~$g^b$ be its respective endpoints.
540 We know that $C_i$ consists of the path $F[f_i^a,e^a]$, the edge~$e$, the path $F[e^b,f_i^b]$,
541 and the edge~$f_i$. Thus~$C$ must contain the paths $F[f_1^a,f_2^a]$ and $F[f_1^b,f_2^b]$ and
542 the edges $f_1$ and~$f_2$, which together form a~simple cycle.
543 \qed
544
545 We now have to make sure that the additional invariant is observed:
546
547 \lemma\id{ithree}%
548 After every operation, I3 is satisfied.
549
550 \proof
551 When the structure is freshly initialized, I3 is obviously satisfied, because all edges
552 are at level~0. Sole deletions of edges (both tree and non-tree) cannot violate I3, so we need
553 to check only the replaces, in particular when an~edge~$e$ either gets its level increased
554 or becomes a~tree edge.
555
556 For the violation to happen, $e$~must be the heaviest on some cycle~$C$, so by the Cycle
557 rule, $e$~must be non-tree. The increase of $\ell(e)$ must therefore happen when~$e$ is
558 considered as a~replacement edge incident with some tree~$T_1$ at level $\ell=\ell(e)$.
559 We will pause the computation just before this increase and we will prove that
560 all other edges of~$C$ already are at levels greater than~$\ell$.
561
562 Let us first show that for edges of~$C$ incident with~$T_1$. All edges of~$T_1$ itself
563 already are on the higher levels as they were moved there at the very beginning of the
564 search for the replacement edge. As the algorithm always tries the lightest candidate
565 for the replacement edge first, all non-tree edges incident with~$T_1$ which are lighter
566 than~$e$ were already considered and thus also moved one level up. This includes all
567 other edges of~$C$ that are incident with~$T_1$.
568
569 The case of edges that do not touch~$T_1$ is easy to handle: Such edges do not exist.
570 If they did, at least two edges of~$C$ would have to be non-tree edges connecting~$T_1$
571 with the other trees at level~$\ell$, so one of them that is lighter than~$e$ would be selected as the
572 replacement edge before~$e$ could be considered.
573 \qed
574
575 We can conclude:
576
577 \thmn{Decremental MSF, Holm et al.~\cite{holm:polylog}}
578 When we start with a~graph with $n$~vertices and~$m\ge n$ edges and we perform
579 $d$~edge deletions, the MSF can be maintained in time $\O((m+d)\cdot\log^2 n)$.
580
581 \paran{Fully dynamic MSF}%
582 The decremental MSF algorithm can be turned to a~fully dynamic one by a~blackbox
583 reduction whose properties are summarized by the following theorem:
584
585 \thmn{MSF dynamization, Henzinger et al.~\cite{henzinger:twoec}, Holm et al.~\cite{holm:polylog}}
586 Suppose that we have a~decremental MSF algorithm that for any $a$,~$b$ can be initialized
587 on a~graph with~$a$ vertices and~$b$ edges and then it executes an~arbitrary sequence
588 of deletions in time $\O(b\cdot t(a,b))$, where~$t$ is a~non-decreasing function.
589 Then there exists a~fully dynamic MSF algorithm for a~graph on $n$~vertices, starting
590 with no edges, that performs $m$~insertions and deletions in amortized time:
591 $$
592 \O\left( \log^3 n + \sum_{i=1}^{\log m} \sum_{j=1}^i \; t(\min(n,2^j), 2^j) \right) \hbox{\quad per operation.}
593 $$
594
595 \proofsketch
596 The reduction is very technical, but its essence is the following: We maintain a~logarithmic number
597 of decremental structures $A_0,\ldots,A_{\log n}$ of exponentially increasing sizes. Every non-tree
598 edge is contained in exactly one~$A_i$, tree edges can belong to multiple structures.
599
600 When an~edge is inserted, we union it with some of the $A_i$'s, build a~new decremental structure
601 and amortize the cost of the build over the insertions. Deletes of non-tree edges are trivial.
602 Delete of a~non-tree edge is performed on all $A_i$'s containing it and the replacement edge is
603 sought among the replacement edges found in these structures. The unused replacement edges then have
604 to be reinserted back to the structure.
605
606 The original reduction of Henzinger et al.~handles the reinserts by a~mechanism of batch insertions
607 supported by their decremental structure, which is not available in our case. Holm et al.~have
608 replaced it by a~system of auxiliary edges inserted at various places in the structure.
609 We refer to the article \cite{holm:polylog} for details.
610 \qed
611
612 \corn{Fully dynamic MSF}
613 There is a~fully dynamic MSF algorithm that works in amortized time $\O(\log^4 n)$
614 per operation for graphs on $n$~vertices.
615
616 \proof
617 Apply the reduction from the previous theorem to the decremental algorithm we have
618 developed. This results in an~algorithm of amortized complexity $\O(\log^4 m)$ where~$m$
619 is the number of operations performed. This could be more than $\O(\log^4 n)$ if
620 $m$~is very large, but we can rebuild the whole structure after $n^2$~operations,
621 which brings $\log m$ down to $\O(\log n)$. The $\O(n^2\log^4 n)$ cost of the
622 rebuild then incurs only $\O(\log^4 n)$ additional cost on each operation.
623 \qed
624
625 \rem
626 The limitation of MSF structures based on the Holm's algorithm for connectivity
627 to edge deletions only seems to be unavoidable. The invariant I3 could be easily
628 broken for many cycles at once whenever a~very light non-tree edge is inserted.
629 We could try increasing the level of the newly inserted edge, but we would quite
630 possibly hit I1 before we skipped the levels of all the heavies edges on the
631 particular cycles.
632
633 On the other hand, if we decided to drop I3, we would encounter different problems.
634 We have enough time to scan all non-tree edges incident to the current tree~$T_1$
635 --- we can charge it on the level increases of its tree edges and if we use the
636 degree reduction from Lemma \ref{degred}, there are at most two non-tree edges
637 per vertex. (The reduction can be used dynamically as it always translates a~single
638 change of the original graph to $\O(1)$ changes of the reduced graph.) The lightest
639 replacement edge however could also be located in the super-trees of~$T_1$ on the
640 lower levels, which are too large to scan and both I1 and I2 prevent us from
641 charging the time on increasing levels there.
642
643 An~interesting special case in which insertions are possible is when all non-tree
644 edges have the same weight. This leads to the following algorithm for dynamic MSF
645 on~graphs with a~small set of allowed edge weights.
646
647 \paran{Dynamic MSF with limited edge weights}%
648 Let us assume for a~while that our graph has edges of only two different weights (let us say
649 1~and~2). We will drop our rule that all edge weights are distinct for a~moment and we recall that
650 the basic structural properties of the MST's from Section \ref{mstbasics} still hold.
651
652 We split the graph~$G$ to two subgraphs~$G_1$ and~$G_2$ according to the edge
653 weights. We use one instance~$\C_1$ of the dynamic connectivity algorithm to maintain
654 an~arbitrary spanning forest~$F_1$ of~$G_1$, which is obviously minimum. Then we add
655 another instance~$\C_2$ to maintain a~spanning forest~$F_2$ of the graph $G_2\cup F_1$
656 such that all edges of~$F_1$ are forced to be in~$F_2$. Obviously, $F_2$~is the
657 MSF of the whole graph~$G$ --- if any edge of~$F_1$ were not contained in~$\msf(G)$,
658 we could use the standard exchange argument to create an~even lighter spanning tree.\foot{This
659 is of course the Blue lemma in action, but we have to be careful as we did not have proven it
660 for graphs with multiple edges of the same weight.}
661
662 When a~weight~2 edge is inserted to~$G$, we insert it to~$\C_2$ and it either enters~$F_2$
663 or becomes a~non-tree edge. Similarly, deletion of a~weight~2 edge is a~pure deletion in~$\C_2$,
664 because such edges can be replaced only by other weight~2 edges.
665
666 Insertion of edges of weight~1 needs more attention: We insert the edge to~$\C_1$. If~$F_1$
667 stays unchanged, we are done. If the new edge enters~$F_1$, we use Sleator-Tarjan trees
668 kept for~$F_2$ to check if the new edge covers some tree edge of weight~2. If this is not
669 the case, we insert the new edge to~$\C_2$ and hence also to~$F_2$ and we are done.
670 Otherwise we exchange one of the covered weight~2 edges~$f$ for~$e$ in~$\C_2$. We note
671 that~$e$ can inherit the level of~$f$ and $f$~can become a~non-tree edge without
672 changing its level. This adjustment can be performed in time $\O(\log^2 n)$, including
673 paying for the future level increases of the new edge.
674
675 Deletion of weight~1 edges is once more straightforward. We delete the edge from~$\C_1$.
676 If it has no replacement, we delete it from~$\C_2$ as well. If it has a~replacement,
677 we delete the edge from~$\C_2$ and insert the replacement on its place as described
678 above. We observe than this pair of operations causes an~insertion, deletion or
679 a~replacement in~$\C_2$.
680
681 This way, we can handle every insertion and deletion in time $\O(\log^2 n)$ amortized.
682 This construction can be iterated in an~obvious way: if we have $k$~distinct edge weights,
683 we build $k$~connectivity structures $\C_1,\ldots,\C_k$. The structure~$\C_i$ contains edges of
684 weight~$i$ and the MSF edges from~$\C_{i-1}$. Bounding the time complexity is then easy:
685
686 \thmn{MSF with limited edge weights}
687 There is a~fully dynamic MSF algorithm that works in time $\O(k\cdot\log^2 n)$ amortized
688 per operation for graphs on $n$~vertices with only $k$~distinct edge weights allowed.
689
690 \proof
691 A~change in the graph~$G$ involving an~edge of weight~$w$ causes a~change in~$\C_w$,
692 which can propagate to~$\C_{w+1}$ and so on, possibly up to~$\C_k$. In each~$\C_i$,
693 we spend time $\O(\log^2 n)$ by updating the connectivity structure according to
694 Theorem \ref{dyncon}.
695 \qed
696
697
698 \endpart