5 \chapter{Advanced MST Algorithms}
7 \section{Minor-closed graph classes}\id{minorclosed}%
9 The contractive algorithm given in Section~\ref{contalg} has been found to perform
10 well on planar graphs, but in the general case its time complexity was not linear.
11 Can we find any broader class of graphs where this algorithm is still linear?
12 The right context turns out to be the minor-closed graph classes, which are
13 closed under contractions and have bounded density.
16 A~graph~$H$ is a \df{minor} of a~graph~$G$ (written as $H\minorof G$) iff it can be obtained
17 from a~subgraph of~$G$ by a sequence of simple graph contractions (see \ref{simpcont}).
20 A~class~$\cal C$ of graphs is \df{minor-closed}, when for every $G\in\cal C$ and
21 every minor~$H$ of~$G$, the graph~$H$ lies in~$\cal C$ as well. A~class~$\cal C$ is called
22 \df{non-trivial} if at least one graph lies in~$\cal C$ and at least one lies outside~$\cal C$.
25 Non-trivial minor-closed classes include:
28 \:graphs embeddable in any fixed surface (i.e., graphs of bounded genus),
29 \:graphs embeddable in~${\bb R}^3$ without knots or without interlocking cycles,
30 \:graphs of bounded tree-width or path-width.
34 Many of the nice structural properties of planar graphs extend to
35 minor-closed classes, too (see Lov\'asz \cite{lovasz:minors} for a~nice survey
36 of this theory and Diestel \cite{diestel:gt} for some of the deeper results).
37 The most important property is probably the characterization
38 of such classes in terms of their forbidden minors.
41 For a~class~$\cal H$ of graphs we define $\Forb({\cal H})$ as the class
42 of graphs that do not contain any of the graphs in~$\cal H$ as a~minor.
43 We will call $\cal H$ the set of \df{forbidden (or excluded) minors} for this class.
44 We will often abbreviate $\Forb(\{M_1,\ldots,M_n\})$ to $\Forb(M_1,\ldots,M_n)$.
47 For every~${\cal H}\ne\emptyset$, the class $\Forb({\cal H})$ is non-trivial
48 and closed on minors. This works in the opposite direction as well: for every
49 minor-closed class~$\cal C$ there is a~class $\cal H$ such that ${\cal C}=\Forb({\cal H})$.
50 One such~$\cal H$ is the complement of~$\cal C$, but smaller ones can be found, too.
51 For example, the planar graphs can be equivalently described as the class $\Forb(K_5, K_{3,3})$
52 --- this follows from the Kuratowski's theorem (the theorem speaks of forbidden
53 subdivisions, but while in general this is not the same as forbidden minors, it
54 is for $K_5$ and $K_{3,3}$). The celebrated theorem by Robertson and Seymour
55 guarantees that we can always find a~finite set of forbidden minors:
57 \thmn{Excluded minors, Robertson \& Seymour \cite{rs:wagner}}
58 For every non-trivial minor-closed graph class~$\cal C$ there exists
59 a~finite set~$\cal H$ of graphs such that ${\cal C}=\Forb({\cal H})$.
62 This theorem has been proven in a~long series of papers on graph minors
63 culminating with~\cite{rs:wagner}. See this paper and follow the references
64 to the previous articles in the series.
67 For analysis of the contractive algorithm,
68 we will make use of another important property --- the bounded density of
69 minor-closed classes. The connection between minors and density dates back to
70 Mader in the 1960's and it can be proven without use of the Robertson-Seymour
74 Let $G$ be a~graph and $\cal C$ be a class of graphs. We define the \df{edge density}
75 $\varrho(G)$ of~$G$ as the average number of edges per vertex, i.e., $m(G)/n(G)$. The
76 edge density $\varrho(\cal C)$ of the class is then defined as the supremum of $\varrho(G)$ over all $G\in\cal C$.
78 \thmn{Mader \cite{mader:dens}}\id{maderthm}%
79 For every $k\in{\bb N}$ there exists $h(k)\in{\bb R}$ such that every graph
80 of average degree at least~$h(k)$ contains a~subdivision of~$K_{k}$ as a~subgraph.
83 (See Lemma 3.5.1 in \cite{diestel:gt} for a~complete proof in English.)
85 Let us fix~$k$ and prove by induction on~$m$ that every graph of average
86 degree at least~$2^m$ contains a~subdivision of some graph with $k$~vertices
87 and $m$~edges (for $k\le m\le {k\choose 2}$). When we reach $m={k\choose 2}$, the theorem follows
88 as the only graph with~$k$ vertices and~$k\choose 2$ edges is~$K_k$.
90 The base case $m=k$: Let us observe that when the average degree
91 is~$a$, removing any vertex of degree less than~$a/2$ does not decrease the
92 average degree. A~graph with $a\ge 2^k$ therefore has a~subgraph
93 with minimum degree $\delta\ge a/2=2^{k-1}$. Such subgraph contains
94 a~cycle on more than~$\delta$ vertices, in other words a~subdivision of
97 Induction step: Let~$G$ be a~graph with average degree at least~$2^m$ and
98 assume that the theorem already holds for $m-1$. Without loss of generality,
99 $G$~is connected. Consider a~maximal set $U\subseteq V$ such that the subgraph $G[U]$
100 induced by~$U$ is connected and the graph $G\sgc U$ ($G$~with $U$~contracted to
101 a~single vertex) has average degree at least~$2^m$ (such~$U$ exists, because
102 $G=G\sgc U$ whenever $\vert U\vert=1$). Now consider the subgraph~$H$ induced
103 in~$G$ by the neighbors of~$U$. Every $v\in V(H)$ must have $\deg_H(v) \ge 2^{m-1}$,
104 as otherwise we can add this vertex to~$U$, contradicting its
105 maximality. By the induction hypothesis, $H$ contains a~subdivision of some
106 graph~$R$ with $k$~vertices and $m-1$ edges. Any two non-adjacent vertices
107 of~$R$ can be connected in the subdivision by a~path lying entirely in~$G[U]$,
108 which reveals a~subdivision of a~graph with $m$~edges. \qed
110 \thmn{Density of minor-closed classes, Mader~\cite{mader:dens}}
111 Every non-trivial minor-closed class of graphs has finite edge density.
114 Let~$\cal C$ be any such class, $X$~its excluded minor with the smallest number
116 As $X\minorof K_x$, the class $\cal C$ is entirely contained in ${\cal C}'=\Forb(K_x)$, so
117 $\varrho({\cal C}) \le \varrho({\cal C}')$ and therefore it suffices to prove the
118 theorem for classes excluding a~single complete graph~$K_x$.
120 We will show that $\varrho({\cal C})\le 2h(x)$, where $h$~is the function
121 from the previous theorem. If any $G\in{\cal C}$ had more than $2h(x)\cdot n(G)$
122 edges, its average degree would be at least~$h(x)$, so by the previous theorem
123 $G$~would contain a~subdivision of~$K_x$ and hence $K_x$ as a~minor.
126 Let us return to the analysis of our algorithm.
128 \thmn{MST on minor-closed classes, Tarjan \cite{tarjan:dsna}}\id{mstmcc}%
129 For any fixed non-trivial minor-closed class~$\cal C$ of graphs, the Contractive Bor\o{u}vka's
130 algorithm (\ref{contbor}) finds the MST of any graph of this class in time
131 $\O(n)$. (The constant hidden in the~$\O$ depends on the class.)
134 Following the proof for planar graphs (\ref{planarbor}), we denote the graph considered
135 by the algorithm at the beginning of the $i$-th Bor\o{u}vka step by~$G_i$ and its number of vertices
136 and edges by $n_i$ and $m_i$ respectively. Again the $i$-th phase runs in time $\O(m_i)$
137 and we have $n_i \le n/2^i$, so it remains to show a linear bound for the $m_i$'s.
139 Since each $G_i$ is produced from~$G_{i-1}$ by a sequence of edge contractions,
140 all $G_i$'s are minors of the input graph.\foot{Technically, these are multigraph contractions,
141 but followed by flattening, so they are equivalent to contractions on simple graphs.}
142 So they also belong to~$\cal C$ and by the Density theorem $m_i\le \varrho({\cal C})\cdot n_i$.
143 The time complexity is therefore $\sum_i \O(m_i) = \sum_i \O(n_i) = \O(\sum_i n/2^i) = \O(n)$.
146 \paran{Local contractions}\id{nobatch}%
147 The contractive algorithm uses ``batch processing'' to perform many contractions
148 in a single step. It is also possible to perform them one edge at a~time,
149 batching only the flattenings. A~contraction of an edge~$uv$ can be done
150 in time~$\O(\deg(u))$ by removing all edges incident with~$u$ and inserting them back
151 with $u$ replaced by~$v$. Therefore we need to find a lot of vertices with small
152 degrees. The following lemma shows that this is always the case in minor-closed
155 \lemman{Low-degree vertices}\id{lowdeg}%
156 Let $\cal C$ be a graph class with density~$\varrho$ and $G\in\cal C$ a~graph
157 with $n$~vertices. Then at least $n/2$ vertices of~$G$ have degree at most~$4\varrho$.
160 Assume the contrary: Let there be at least $n/2$ vertices with degree
161 greater than~$4\varrho$. Then $\sum_v \deg(v) > n/2
162 \cdot 4\varrho = 2\varrho n$, which is in contradiction with the number
163 of edges being at most $\varrho n$.
167 The proof can be also viewed
168 probabilistically: let $X$ be the degree of a vertex of~$G$ chosen uniformly at
169 random. Then $\E X \le 2\varrho$, hence by the Markov's inequality
170 ${\rm Pr}[X > 4\varrho] < 1/2$, so for at least $n/2$ vertices~$v$ we have
171 $\deg(v)\le 4\varrho$.
173 \algn{Local Bor\o{u}vka's Algorithm, Mare\v{s} \cite{mm:mst}}%
175 \algin A~graph~$G$ with an edge comparison oracle and a~parameter~$t\in{\bb N}$.
177 \:$\ell(e)\=e$ for all edges~$e$.
179 \::While there exists a~vertex~$v$ such that $\deg(v)\le t$:
180 \:::Select the lightest edge~$e$ incident with~$v$.
182 \:::$T\=T + \ell(e)$.
183 \::Flatten $G$, removing parallel edges and loops.
184 \algout Minimum spanning tree~$T$.
188 When $\cal C$ is a minor-closed class of graphs with density~$\varrho$, the
189 Local Bor\o{u}vka's Algorithm with the parameter~$t$ set to~$4\varrho$
190 finds the MST of any graph from this class in time $\O(n)$. (The constant
191 in the~$\O$ depends on~the class.)
194 Let us denote by $G_i$, $n_i$ and $m_i$ the graph considered by the
195 algorithm at the beginning of the $i$-th iteration of the outer loop,
196 and the number of its vertices and edges respectively. As in the proof
197 of the previous algorithm (\ref{mstmcc}), we observe that all the $G_i$'s
198 are minors of the graph~$G$ given as the input.
200 For the choice $t=4\varrho$, the Lemma on low-degree vertices (\ref{lowdeg})
201 guarantees that at the beginning of the $i$-th iteration, at least $n_i/2$ vertices
202 have degree at most~$t$. Each selected edge removes one such vertex and
203 possibly increases the degree of another one, so at least $n_i/4$ edges get selected.
204 Hence $n_i\le 3/4\cdot n_{i-1}$ and $n_i\le n\cdot (3/4)^i$, so the
205 algorithm terminates after $\O(\log n)$ iterations.
207 Each selected edge belongs to $\mst(G)$, because it is the lightest edge of
208 the trivial cut $\delta(v)$ (see the Blue rule, Lemma \ref{rbma}).
209 The steps 6 and~7 therefore correspond to the operation
210 described by the Contraction Lemma (\ref{contlemma}) and when
211 the algorithm stops, $T$~is indeed the minimum spanning tree.
213 It remains to analyse the time complexity of the algorithm. Since $G_i\in{\cal C}$, we know that
214 $m_i\le \varrho n_i \le \varrho n/2^i$.
215 We will show that the $i$-th iteration is carried out in time $\O(m_i)$.
216 Steps 5 and~6 run in time $\O(\deg(v))=\O(t)$ for each~$v$, so summed
217 over all $v$'s they take $\O(tn_i)$, which is $\O(n_i)$ for a fixed class~$\cal C$.
218 Flattening takes $\O(m_i)$ as already noted in the analysis of the Contracting
219 Bor\o{u}vka's Algorithm (see \ref{contiter}).
221 The whole algorithm therefore runs in time $\O(\sum_i m_i) = \O(\sum_i n/2^i) = \O(n)$.
224 \paran{Back to planar graphs}%
225 For planar graphs, we can obtain a sharper version of the low-degree lemma
226 showing that the algorithm works with $t=8$ as well (we had $t=12$ from
227 $\varrho=3$). While this does not change the asymptotic time complexity
228 of the algorithm, the constant-factor speedup can still delight the hearts of
231 \lemman{Low-degree vertices in planar graphs}%
232 Let $G$ be a planar graph with $n$~vertices. Then at least $n/2$ vertices of~$v$
233 have degree at most~8.
236 It suffices to show that the lemma holds for triangulations (if there
237 are any edges missing, the situation can only get better) with at
238 least 4 vertices. Since $G$ is planar, we have $\sum_v \deg(v) < 6n$.
239 The numbers $d(v):=\deg(v)-3$ are non-negative and $\sum_v d(v) < 3n$,
240 so by the same argument as in the proof of the general lemma, for at least $n/2$
241 vertices~$v$ it holds that $d(v) < 6$, and thus $\deg(v) \le 8$.
245 The constant~8 in the previous lemma is the best we can have.
246 Consider a $k\times k$ triangular grid. It has $n=k^2$ vertices, $\O(k)$ of them
247 lie on the outer face and they have degree at most~6, the remaining $n-\O(k)$ interior
248 vertices have degree exactly~6. Therefore the number of faces~$f$ is $6/3\cdot n=2n$,
249 ignoring terms of order $\O(k)$. All interior triangles can be properly colored with
250 two colors, black and white. Now add a~new vertex inside each white face and connect
251 it to all three vertices on the boundary of that face (see the picture). This adds $f/2 \approx n$
252 vertices of degree~3 and it increases the degrees of the original $\approx n$ interior
253 vertices to~9, therefore about a~half of the vertices of the new planar graph
256 \figure{hexangle.eps}{\epsfxsize}{The construction from Remark~\ref{hexa}}
259 The observation in~Theorem~\ref{mstmcc} was also used by Gustedt \cite{gustedt:parallel},
260 to construct parallel version of the Contractive Bor\o{u}vka's algorithm applied
261 to minor-closed classes.
264 The bound on the average degree needed to enforce a~$K_k$ minor, which we get from Theorem \ref{maderthm},
265 is very coarse. Kostochka \cite{kostochka:lbh} and independently Thomason \cite{thomason:efc}
266 have proven that an~average degree $\Omega(k\sqrt{\log k})$ is sufficient and that this
267 is the best what we can get.
270 Minor-closed classes share many other interesting properties, for example bounded chromatic
271 numbers of various kinds, as shown by Theorem 6.1 of \cite{nesetril:minors}. We can expect
272 that many algorithmic problems will turn out to be easy for them.
274 %--------------------------------------------------------------------------------
276 \section{Iterated algorithms}\id{iteralg}%
278 We have seen that the Jarn\'\i{}k's Algorithm \ref{jarnik} runs in $\Theta(m\log n)$ time.
279 Fredman and Tarjan \cite{ft:fibonacci} have shown a~faster implementation
280 using their Fibonacci heaps. In this section, we will convey their results and we
281 will show several interesting consequences.
283 The previous implementation of the algorithm used a binary heap to store all edges
284 separating the current tree~$T$ from the rest of the graph, i.e., edges of the cut~$\delta(T)$.
285 Instead of that, we will remember the vertices adjacent to~$T$ and for each such vertex~$v$ we
286 will maintain the lightest edge~$uv$ such that $u$~lies in~$T$. We will call these edges \df{active edges}
287 and keep them in a~Fibonacci heap, ordered by weight.
289 When we want to extend~$T$ by the lightest edge of~$\delta(T)$, it is sufficient to
290 find the lightest active edge~$uv$ and add this edge to~$T$ together with the new vertex~$v$.
291 Then we have to update the active edges as follows. The edge~$uv$ has just ceased to
292 be active. We scan all neighbors~$w$ of the vertex~$v$. When $w$~is already in~$T$, no action
293 is needed. If $w$~is outside~$T$ and it was not adjacent to~$T$ (there is no active edge
294 remembered for it so far), we set the edge~$vw$ as active. Otherwise we check the existing
295 active edge for~$w$ and replace it by~$vw$ if the new edge is lighter.
297 The following algorithm shows how these operations translate to insertions, decreases
298 and deletions in the heap.
300 \algn{Active Edge Jarn\'\i{}k; Fredman and Tarjan \cite{ft:fibonacci}}\id{jarniktwo}%
302 \algin A~graph~$G$ with an edge comparison oracle.
303 \:$v_0\=$ an~arbitrary vertex of~$G$.
304 \:$T\=$ a tree containing just the vertex~$v_0$.
305 \:$H\=$ a~Fibonacci heap of active edges stored as pairs $(u,v)$ where $u\in T,v\not\in T$, ordered by the weights $w(uv)$, and initially empty.
306 \:$A\=$ a~mapping of vertices outside~$T$ to their active edges in the heap; initially all elements undefined.
307 \:\<Insert> all edges incident with~$v_0$ to~$H$ and update~$A$ accordingly.
308 \:While $H$ is not empty:
309 \::$(u,v)\=\<DeleteMin>(H)$.
311 \::For all edges $vw$ such that $w\not\in T$:
312 \:::If there exists an~active edge~$A(w)$:
313 \::::If $vw$ is lighter than~$A(w)$, \<Decrease> $A(w)$ to~$(v,w)$ in~$H$.
314 \:::If there is no such edge, then \<Insert> $(v,w)$ to~$H$ and set~$A(w)$.
315 \algout Minimum spanning tree~$T$.
319 To analyse the time complexity of this algorithm, we will use the standard
320 theorem on~complexity of the Fibonacci heap:
322 \thmn{Fibonacci heaps, Fredman and Tarjan \cite{ft:fibonacci}} The~Fibonacci heap performs the following operations
323 with the indicated amortized time complexities:
325 \:\<Insert> (insertion of a~new element) in $\O(1)$,
326 \:\<Decrease> (decreasing the value of an~existing element) in $\O(1)$,
327 \:\<Merge> (merging of two heaps into one) in $\O(1)$,
328 \:\<DeleteMin> (deletion of the minimal element) in $\O(\log n)$,
329 \:\<Delete> (deletion of an~arbitrary element) in $\O(\log n)$,
331 \>where $n$ is the number of elements present in the heap at the time of
335 See Fredman and Tarjan \cite{ft:fibonacci} for both the description of the Fibonacci
336 heap and the proof of this theorem.
340 Algorithm~\ref{jarniktwo} with the Fibonacci heap finds the MST of the input graph in time~$\O(m+n\log n)$.
343 The algorithm always stops, because every edge enters the heap~$H$ at most once.
344 As it selects exactly the same edges as the original Jarn\'\i{}k's algorithm,
345 it gives the correct answer.
347 The time complexity is $\O(m)$ plus the cost of the heap operations. The algorithm
348 performs at most one \<Insert> or \<Decrease> per edge and exactly one \<DeleteMin>
349 per vertex. There are at most $n$ elements in the heap at any given time,
350 thus by the previous theorem the operations take $\O(m+n\log n)$ time in total.
354 For graphs with edge density $\Omega(\log n)$, this algorithm runs in linear time.
357 We can consider using other kinds of heaps that have the property that inserts
358 and decreases are faster than deletes. Of course, the Fibonacci heaps are asymptotically
359 optimal (by the standard $\Omega(n\log n)$ lower bound on sorting by comparisons, see
360 for example \cite{clrs}), so the other data structures can improve only
361 multiplicative constants or offer an~easier implementation.
363 A~nice example is the \df{$d$-regular heap} --- a~variant of the usual binary heap
364 in the form of a~complete $d$-regular tree. \<Insert>, \<Decrease> and other operations
365 involving bubbling the values up spend $\O(1)$ time at a~single level, so they run
366 in~$\O(\log_d n)$ time. \<Delete> and \<DeleteMin> require bubbling down, which incurs
367 comparison with all~$d$ sons at every level, so they spend $\O(d\log_d n)$.
368 With this structure, the time complexity of the whole algorithm
369 is $\O(nd\log_d n + m\log_d n)$, which suggests setting $d=m/n$, yielding $\O(m\log_{m/n}n)$.
370 This is still linear for graphs with density at~least~$n^{1+\varepsilon}$.
372 Another possibility is to use the 2-3-heaps \cite{takaoka:twothree} or Trinomial
373 heaps \cite{takaoka:trinomial}. Both have the same asymptotic complexity as Fibonacci
374 heaps (the latter even in the worst case, but it does not matter here) and their
375 authors claim faster implementation. For integer weights, we can use Thorup's priority
376 queues described in \cite{thorup:sssp} which have constant-time \<Insert> and \<Decrease>
377 and $\O(\log\log n)$ time \<DeleteMin>. (We will however omit the details since we will
378 show a~faster integer algorithm soon.)
380 \paran{Combining MST algorithms}%
381 As we already noted, the improved Jarn\'\i{}k's algorithm runs in linear time
382 for sufficiently dense graphs. In some cases, it is useful to combine it with
383 another MST algorithm, which identifies a~part of the MST edges and contracts
384 them to increase the density of the graph. For example, we can perform several Bor\o{u}vka
385 steps and then find the rest of the MST by the Active Edge Jarn\'\i{}k's algorithm.
387 \algn{Mixed Bor\o{u}vka-Jarn\'\i{}k}
389 \algin A~graph~$G$ with an edge comparison oracle.
390 \:Run $\log\log n$ Bor\o{u}vka steps (\ref{contbor}), getting a~MST~$T_1$.
391 \:Run the Active Edge Jarn\'\i{}k's algorithm (\ref{jarniktwo}) on the resulting
392 graph, getting a~MST~$T_2$.
393 \:Combine $T_1$ and~$T_2$ to~$T$ as in the Contraction lemma (\ref{contlemma}).
394 \algout Minimum spanning tree~$T$.
398 The Mixed Bor\o{u}vka-Jarn\'\i{}k algorithm finds the MST of the input graph in time $\O(m\log\log n)$.
401 Correctness follows from the Contraction lemma and from the proofs of correctness of the respective algorithms.
402 As~for time complexity: The first step takes $\O(m\log\log n)$ time
403 (by Lemma~\ref{contiter}) and it gradually contracts~$G$ to a~graph~$G'$ of size
404 $m'\le m$ and $n'\le n/\log n$. The second step then runs in time $\O(m'+n'\log n') = \O(m)$
405 and both trees can be combined in linear time, too.
408 \paran{Iterating Jarn\'\i{}k's algorithm}%
409 Actually, there is a~much better choice of the algorithms to combine: use the
410 Active Edge Jarn\'\i{}k's algorithm multiple times, each time stopping it after a~while.
411 A~good choice of the stopping condition is to place a~limit on the size of the heap.
412 We start with an~arbitrary vertex, grow the tree as usually and once the heap gets too large,
413 we conserve the current tree and start with a~different vertex and an~empty heap. When this
414 process runs out of vertices, it has identified a~sub-forest of the MST, so we can
415 contract the edges of~this forest and iterate.
417 \algn{Iterated Jarn\'\i{}k; Fredman and Tarjan \cite{ft:fibonacci}}\id{itjar}%
419 \algin A~graph~$G$ with an edge comparison oracle.
420 \:$T\=\emptyset$. \cmt{edges of the MST}
421 \:$\ell(e)\=e$ for all edges~$e$. \cmt{edge labels as usually}
422 \:$m_0\=m$. \cmt{in the following, $n$ and $m$ will change with the graph}
423 \:While $n>1$: \cmt{We will call iterations of this loop \df{phases}.}
424 \::$F\=\emptyset$. \cmt{forest built in the current phase}
425 \::$t\=2^{\lceil 2m_0/n \rceil}$. \cmt{the limit on heap size}
426 \::While there is a~vertex $v_0\not\in F$:
427 \:::Run the Active Edge Jarn\'\i{}k's algorithm (\ref{jarniktwo}) from~$v_0$, stop when:
428 \::::all vertices have been processed, or
429 \::::a~vertex of~$F$ has been added to the tree, or
430 \::::the heap has grown to more than~$t$ elements.
431 \:::Denote the resulting tree~$R$.
433 \::$T\=T\cup \ell[F]$. \cmt{Remember MST edges found in this phase.}
434 \::Contract all edges of~$F$ and flatten~$G$.
435 \algout Minimum spanning tree~$T$.
439 For analysis of the algorithm, let us denote the graph entering the $i$-th
440 phase by~$G_i$ and likewise with the other parameters. Let the trees from which
441 $F_i$~has been constructed be called $R_i^1, \ldots, R_i^{z_i}$. The
442 non-indexed $G$, $m$ and~$n$ will correspond to the graph given as~input.
445 However the choice of the parameter~$t$ can seem mysterious, the following
446 lemma makes the reason clear:
449 Each phase of the Iterated Jarn\'\i{}k's algorithm runs in time~$\O(m)$.
452 During the $i$-th phase, the heap always contains at most~$t_i$ elements, so it takes
453 time~$\O(\log t_i)=\O(m/n_i)$ to delete an~element from the heap. The trees~$R_i^j$
454 are edge-disjoint, so there are at most~$n_i$ \<DeleteMin>'s over the course of the phase.
455 Each edge is considered at most twice (once per its endpoint), so the number
456 of the other heap operations is~$\O(m_i)$. Together, it equals $\O(m_i + n_i\log t_i) = \O(m_i+m) = \O(m)$.
460 Unless the $i$-th phase is final, the forest~$F_i$ consists of at most $2m_i/t_i$ trees.
463 As every edge of~$G_i$ is incident with at most two trees of~$F_i$, it is sufficient
464 to establish that there are at least~$t_i$ edges incident with every such tree, including
465 edges connecting two vertices of the same tree.
467 The forest~$F_i$ evolves by additions of the trees~$R_i^j$. Let us consider the possibilities
468 how the algorithm could have stopped growing the tree~$R_i^j$:
470 \:the heap had more than~$t_i$ elements (step~10): since the each elements stored in the heap
471 corresponds to a~unique edge incident with~$R_i^j$, we have enough such edges;
472 \:the algorithm just added a~vertex of~$F_i$ to~$R_i^j$ (step~9): in this case, an~existing
473 tree of~$F_i$ is extended, so the number of edges incident with it cannot decrease;\foot{%
474 This is the place where we needed to count the interior edges as well.}
475 \:all vertices have been processed (step~8): this can happen only in the final phase.
480 The Iterated Jarn\'\i{}k's algorithm finds the MST of the input graph in time
481 $\O(m\timesbeta(m,n))$, where $\beta(m,n):=\min\{ i \mid \log^{(i)}n \le m/n \}$.
484 Phases are finite and in every phase at least one edge is contracted, so the outer
485 loop is eventually terminated. The resulting subgraph~$T$ is equal to $\mst(G)$, because each $F_i$ is
486 a~subgraph of~$\mst(G_i)$ and the $F_i$'s are glued together according to the Contraction
487 lemma (\ref{contlemma}).
489 Let us bound the sizes of the graphs processed in the individual phases. As the vertices
490 of~$G_{i+1}$ correspond to the components of~$F_i$, by the previous lemma $n_{i+1}\le
491 2m_i/t_i$. Then $t_{i+1} = 2^{\lceil 2m/n_{i+1} \rceil} \ge 2^{2m/n_{i+1}} \ge 2^{2m/(2m_i/t_i)} = 2^{(m/m_i)\cdot t_i} \ge 2^{t_i}$,
494 \left. \vcenter{\hbox{$\displaystyle t_i \ge 2^{2^{\scriptstyle 2^{\scriptstyle\rddots^{\scriptstyle m/n}}}} $}}\;\right\}
495 \,\hbox{a~tower of~$i$ exponentials.}
497 As soon as~$t_i\ge n$, the $i$-th phase is final, because at that time
498 there is enough space in the heap to process the whole graph without stopping. So~there are
499 at most~$\beta(m,n)$ phases and we already know that each phase runs in linear
500 time (Lemma~\ref{ijphase}).
504 The Iterated Jarn\'\i{}k's algorithm runs in time $\O(m\log^* n)$.
507 $\beta(m,n) \le \beta(n,n) \le \log^* n$.
511 When we use the Iterated Jarn\'\i{}k's algorithm on graphs with edge density
512 at least~$\log^{(k)} n$ for some $k\in{\bb N}^+$, it runs in time~$\O(km)$.
515 If $m/n \ge \log^{(k)} n$, then $\beta(m,n)\le k$.
518 \paran{Integer weights}%
519 The algorithm spends most of the time in phases which have small heaps. Once the
520 heap grows to $\Omega(\log^{(k)} n)$ for any fixed~$k$, the graph gets dense enough
521 to guarantee that at most~$k$ phases remain. This means that if we are able to
522 construct a~heap of size $\Omega(\log^{(k)} n)$ with constant time per operation,
523 we can get a~linear-time algorithm for MST. This is the case when the weights are
526 \thmn{MST for integer weights, Fredman and Willard \cite{fw:transdich}}\id{intmst}%
527 MST of a~graph with integer edge weights can be found in time $\O(m)$ on the Word-RAM.
530 We will combine the Iterated Jarn\'\i{}k's algorithm with the Q-heaps from Section \ref{qheaps}.
531 We modify the first pass of the algorithm to choose $t=\log n$ and use the Q-heap tree instead
532 of the Fibonacci heap. From Theorem \ref{qh} and Remark \ref{qhtreerem} we know that the
533 operations on the Q-heap tree run in constant time, so the modified first phase takes time~$\O(m)$.
534 Following the analysis of the original algorithm in the proof of Theorem \ref{itjarthm} we obtain
535 $t_2\ge 2^{t_1} = 2^{\log n} = n$, so the algorithm stops after the second phase.\foot{%
536 Alternatively, we can use the Q-heaps directly with $k=\log^{1/4}n$ and then the algorithm stops
537 after the third phase.}
540 \paran{Further improvements}%
541 Gabow et al.~\cite{gabow:mst} have shown how to speed up the Iterated Jarn\'\i{}k's algorithm to~$\O(m\log\beta(m,n))$.
542 They split the adjacency lists of the vertices to small buckets, keep each bucket
543 sorted and consider only the lightest edge in each bucket until it is removed.
544 The mechanics of the algorithm is complex and there is a~lot of technical details
545 which need careful handling, so we omit the description of this algorithm.
546 A~better algorithm will be shown in Chapter~\ref{optchap}.
548 %--------------------------------------------------------------------------------
550 \section{Verification of minimality}\id{verifysect}%
552 Now we will turn our attention to a~slightly different problem: given a~spanning
553 tree, how to verify that it is minimum? We will show that this can be achieved
554 in linear time and it will serve as a~basis for a~randomized linear-time
555 MST algorithm in Section~\ref{randmst}.
557 MST verification has been studied by Koml\'os \cite{komlos:verify}, who has
558 proven that $\O(m)$ edge comparisons are sufficient, but his algorithm needed
559 super-linear time to find the edges to compare. Dixon, Rauch and Tarjan \cite{dixon:verify}
560 have later shown that the overhead can be reduced
561 to linear time on the RAM using preprocessing and table lookup on small
562 subtrees. Later, King has given a~simpler algorithm in \cite{king:verifytwo}.
564 In this section, we will follow Koml\'os's steps and study the comparisons
565 needed, saving the actual efficient implementation for later.
568 To verify that a~spanning tree~$T$ is minimum, it is sufficient to check that all
569 edges outside~$T$ are $T$-heavy (by the Minimality Theorem, \ref{mstthm}). In fact, we will be
570 able to find all $T$-light edges efficiently. For each edge $uv\in E\setminus T$,
571 we will find the heaviest edge of the tree path $T[u,v]$ and compare its weight
572 to $w(uv)$. It is therefore sufficient to solve the following problem:
575 Given a~weighted tree~$T$ and a~set of \df{query paths} $Q \subseteq \{ T[u,v] \mid u,v\in V(T) \}$
576 specified by their endpoints, find the heaviest edge \df{(peak)} of every path in~$Q$.
578 \paran{Bor\o{u}vka trees}%
579 Finding the peaks can be burdensome if the tree~$T$ is degenerated,
580 so we will first reduce it to the same problem on a~balanced tree. We run
581 the Bor\o{u}vka's algorithm on~$T$, which certainly produces $T$ itself, and we
582 record the order, in which the subtrees have been merged, in another tree~$B(T)$.
583 The peak queries on~$T$ can be then easily translated to peak queries on~$B(T)$.
586 For a~weighted tree~$T$ we define its \df{Bor\o{u}vka tree} $B(T)$ as a~rooted tree which records
587 the execution of the Bor\o{u}vka's algorithm run on~$T$. The leaves of $B(T)$
588 are all the vertices of~$T$, an~internal vertex~$v$ at level~$i$ from the bottom
589 corresponds to a~component tree~$C(v)$ formed in the $i$-th iteration of the algorithm. When
590 a~tree $C(v)$ selects an adjacent edge~$e$ and gets merged with some other trees to form
591 a~component $C(u)$, we add an~edge $uv$ to~$B(T)$ and set its weight to $w(e)$.
593 \figure{bortree.eps}{\epsfxsize}{An octipede and its Bor\o{u}vka tree}
596 As the algorithm finishes with a~single component in the last phase, the Bor\o{u}vka tree
597 is really a~tree. All its leaves are on the same level and each internal vertex has
598 at least two sons. Such trees will be called \df{complete branching trees.}
601 For every tree~$T$ and every pair of its vertices $x,y\in V(T)$, the peak
602 of the path $T[x,y]$ has the same weight as the peak of~the path $B(T)[x,y]$.
605 Let us denote the path $T[x,y]$ by~$P$ and its heaviest edge by~$h=ab$. Similarly,
606 let us use $P'$ for $B(T)[x,y]$ and $h'$ for the heaviest edge of~$P'$.
608 We will first prove that~$h$ has its counterpart of the same weight in~$P'$,
609 so $w(h') \ge w(h)$. Consider the lowest vertex $u$ of~$B(T)$ such that the
610 component $C(u)$ contains both $a$ and~$b$, and consider the sons $v_a$ and $v_b$ of~$u$
611 for which $a\in C(v_a)$ and $b\in C(v_b)$. As the edge~$h$ must have been
612 selected by at least one of these components, we assume without loss of generality that
613 it was $C(v_a)$, and hence we have $w(uv_a)=w(h)$. We will show that the
614 edge~$uv_a$ lies in~$P'$, because exactly one of the vertices $x$, $y$ lies
615 in~$C(v_a)$. Both cannot lie there, since it would imply that $C(v_a)$,
616 being connected, contains the whole path~$P$, including~$h$. On the other hand,
617 if $C(v_a)$ contained neither~$x$ nor~$y$, it would have to be incident with
618 another edge of~$P$ different from~$h$, so this lighter edge would be selected
621 In the other direction: for any edge~$uv\in P'$, the tree~$C(v)$ is incident
622 with at least one edge of~$P$, so the selected edge must be lighter or equal
623 to this edge and hence also to~$h$.
627 We will simplify the problem even further: For an~arbitrary tree~$T$, we split each
628 query path $T[x,y]$ to two half-paths $T[x,a]$ and $T[a,y]$ where~$a$ is the
629 \df{lowest common ancestor} of~$x$ and~$y$ in~$T$. It is therefore sufficient to
630 consider only paths that connect a~vertex with one of its ancestors.
632 When we combine the two transforms, we get:
634 \lemman{Balancing of trees}\id{verbranch}%
635 For each tree~$T$ on $n$~vertices and a~set~$Q$ of $q$~query paths on~$T$, it is possible
636 to find a~complete branching tree~$T'$, together with a~set~$Q'$ of paths on~$T'$,
637 such that the weights of the heaviest edges of the paths in~$Q$ can be deduced from
638 the same of the paths in~$Q'$. The tree $T'$ has at most $2n$ vertices and $\O(\log n)$
639 levels. The set~$Q'$ contains at most~$2q$ paths and each of them connects a~vertex of~$T'$
640 with one of its ancestors. The construction of~$T'$ involves $\O(n)$ comparisons
641 and the transformation of the answers takes $\O(q)$ comparisons.
644 The tree~$T'$ will be the Bor\o{u}vka tree for~$T$, obtained by running the
645 contractive version of the Bor\o{u}vka's algorithm (Algorithm \ref{contbor})
646 on~$T$. The algorithm runs in linear time, for example because trees are planar
647 (Theorem \ref{planarbor}). We therefore spend $\O(n)$ comparisons in it.
649 As~$T'$ has~$n$ leaves and it is a~complete branching tree, it has at most~$n$ internal vertices,
650 so~$n(T')\le 2n$ as promised. Since the number of iterations of the Bor\o{u}vka's
651 algorithm is $\O(\log n)$, the depth of the Bor\o{u}vka tree must be logarithmic as well.
653 For each query path $T[x,y]$ we find the lowest common ancestor of~$x$ and~$y$
654 and split the path by the two half-paths. This produces a~set~$Q'$ of at most~$2q$ half-paths.
655 The peak of every original query path is then the heavier of the peaks of its halves.
658 \paran{Bounding comparisons}%
659 We will now describe a~simple variant of the depth-first search which finds the
660 peaks of all query paths of the balanced problem. As we promised,
661 we will take care of the number of comparisons only, as long as all other operations
662 are well-defined and they can be performed in polynomial time.
665 For every edge~$e=uv$, we consider the set $Q_e$ of all query paths containing~$e$.
666 The vertex of a~path, that is closer to the root, will be called the \df{top} of the path,
667 the other vertex its \df{bottom.}
668 We define arrays $T_e$ and~$P_e$ as follows: $T_e$~contains
669 the tops of the paths in~$Q_e$ in order of their increasing depth (we
670 will call them \df{active tops} and each of them will be stored exactly once). For
671 each active top~$t=T_e[i]$, we define $P_e[i]$ as the peak of the path $T[v,t]$.
674 As for every~$i$ the path $T[v,T_e[i+1]]$ is contained within $T[v,T_e[i]]$,
675 the edges of~$P_e$ must have non-increasing weights, that is $w(P_e[i+1]) \le
677 This leads to the following algorithm:
679 \alg $\<FindPeaks>(u,p,T_p,P_p)$ --- process all queries located in the subtree rooted
680 at~$u$ entered from its parent via an~edge~$p$.
684 \:Process all query paths whose bottom is~$u$ and record their peaks.
685 This is accomplished by finding the index~$i$ of each path's top in~$T_p$ and reading
686 the desired edge from~$P_p[i]$.
688 \:For every son~$v$ of~$u$, process the edge $e=uv$:
690 \::Construct the array of tops~$T_e$ for the edge~$e$: Start with~$T_p$, remove
691 the tops of the paths that do not contain~$e$ and add the vertex~$u$ itself
692 if there is a~query path which has~$u$ as its top and whose bottom lies somewhere
693 in the subtree rooted at~$v$.
695 \::Prepare the array of the peaks~$P_e$: Start with~$P_p$, remove the entries
696 corresponding to the tops that are no longer active. If $u$ became an~active
697 top, append~$e$ to the array.
700 Since the paths leading to all active tops have been extended by the
701 edge~$e$, compare $w(e)$ with weights of the edges recorded in~$P_e$ and replace
702 those edges which are lighter by~$e$.
703 Since $P_p$ was sorted, we can use binary search
704 to locate the boundary between the lighter and heavier edges in~$P_e$.
706 \::Recurse on~$v$: call $\<FindPeaks>(v,e,T_e,P_e)$.
709 \>As we need a~parent edge to start the recursion, we add an~imaginary parent
710 edge~$p_0$ of the root vertex~$r$, for which no queries are defined. We can
711 therefore start with $\<FindPeaks>(r,p_0,\emptyset,\emptyset)$.
713 Let us account for the comparisons:
715 \lemma\id{vercompares}%
716 When the procedure \<FindPeaks> is called on the balanced problem, it
717 performs $\O(n+q)$ comparisons, where $n$ is the size of the tree and
718 $q$ is the number of query paths.
721 We will calculate the number of comparisons~$c_i$ performed when processing the edges
722 going from the $(i+1)$-th to the $i$-th level of the tree.
723 The levels are numbered from the bottom, so leaves are at level~0 and the root
724 is at level $\ell\le \lceil \log_2 n\rceil$. There are $n_i\le n/2^i$ vertices
725 at the $i$-th level, so we consider exactly $n_i$ edges. To avoid taking a~logarithm\foot{All logarithms are binary.}
726 of zero, we define $\vert T_e\vert=1$ for $T_e=\emptyset$.
727 \def\eqalign#1{\null\,\vcenter{\openup\jot
728 \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
730 $$\vcenter{\openup\jot\halign{\strut\hfil $\displaystyle{#}$&$\displaystyle{{}#}$\hfil&\quad#\hfil\cr
731 c_i &\le \sum_e \left( 1 + \log \vert T_e\vert \right)&(Total cost of the binary searches.)\cr
732 &\le n_i + \sum_e \log\vert T_e\vert&(We sum over $n_i$ edges.)\cr
733 &\le n_i + n_i \cdot {\sum_e \log\vert T_e\vert \over n_i}&(Consider the average of logarithms.) \cr
734 &\le n_i + n_i \cdot \log{\sum_e \vert T_e\vert \over n_i}&(Logarithm is concave.) \cr
735 &\le n_i + n_i \cdot \log{q+n\over n_i}&(Bound the number of tops by queries.) \cr
736 &= n_i \cdot \left( 1 + \log\left({q+n\over n}\cdot{n\over n_i}\right) \right)\cr
737 &= n_i + n_i\log{q+n\over n} + n_i\log{n\over n_i}.\cr
739 Summing over all levels, we estimate the total number of comparisons as:
741 c = \sum_i c_i = \left( \sum_i n_i \right) + \left( \sum_i n_i \log{q+n\over n}\right) + \left( \sum_i n_i \log{n\over n_i}\right).
743 The first part is equal to~$n$, the second one to $n\log((q+n)/n)\le q+n$. For the third
744 one, we would like to plug in the bound $n_i \le n/2^i$, but we unfortunately have one~$n_i$
745 in the denominator. We save the situation by observing that the function $f(x)=x\log(n/x)$
746 is decreasing\foot{We can easily check the derivative: $f(x)=(x\ln n-x\ln x)/\ln 2$, so $f'(x)\cdot \ln2 =
747 \ln n - \ln x - 1$. We want $f'(x)<0$ and therefore $\ln x > \ln n - 1$, i.e., $x > n/e$.}
748 for $x > n/e$, so for $i\ge 2$ it holds that:
750 n_i\log{n\over n_i} \le {n\over 2^i}\cdot\log{n\over n/2^i} = {n\over 2^i} \cdot i.
752 We can therefore rewrite the third part as:
754 \sum_i n_i\log{n\over n_i} &\le n_0\log{n\over n_0} + n_1\log{n\over n_1} + n\cdot\sum_{i\ge 2}{i\over 2^i} \le\cr
755 &\le n\log1 + n_1\cdot {n\over n_1} + n\cdot\O(1) = \O(n).\cr
757 Putting all three parts together, we conclude that:
759 c \le n + (q+n) + \O(n) = \O(n+q). \qedmath
763 When we combine this lemma with the above reduction from general trees to balanced trees, we get the following theorem:
765 \thmn{Verification of the MST, Koml\'os \cite{komlos:verify}}\id{verify}%
766 For every weighted graph~$G$ and its spanning tree~$T$, it is sufficient to
767 perform $\O(m)$ comparisons of edge weights to determine whether~$T$ is minimum
768 and to find all $T$-light edges in~$G$.
771 We first transform the problem to finding all peaks of a~set
772 of query paths in~$T$ (these are exactly the paths covered by the edges
773 of $G\setminus T$). We use the reduction from Lemma \ref{verbranch} to get
774 an~equivalent problem with a~full branching tree and a~set of parent-descendant
775 paths. The reduction costs $\O(m+n)$ comparisons.
776 Then we run the \<FindPeaks> procedure (Algorithm \ref{findpeaks}) to find
777 the tops of all query paths. According to Lemma \ref{vercompares}, this spends another $\O(m+n)$
778 comparisons. Since we (as always) assume that~$G$ is connected, $\O(m+n)=\O(m)$.
781 \paran{Other applications}%
782 The problem of computing path maxima or minima in a~weighted tree has several other interesting
783 applications. One of them is computing minimum cuts separating given pairs of vertices in a~given
784 weighted undirected graph~$G$. We construct a~Gomory-Hu tree~$T$ for the graph as described in \cite{gomoryhu}
785 (see also \cite{bhalgat:ght} for a~more efficient algorithm running in time
786 $\widetilde\O(mn)$ for unit-cost graphs). The crucial property of this tree is that for every two
787 vertices $u$, $v$ of the graph~$G$, the minimum-cost edge on $T[u,v]$ has the same cost
788 as the minimum cut separating $u$ and~$v$ in~$G$. Since the construction of~$T$ generally
789 takes $\Omega(n^2)$ time, we could of course invest this time in precomputing the minima for
790 all pairs of vertices. This would however require quadratic space, so we can better use
791 the method of this section which fits in $\O(n+q)$ space for $q$~queries.
793 \paran{Dynamic verification}%
794 A~dynamic version of the problem is also often considered. It calls for a~data structure
795 representing a~weighted forest with operations for modifying the structure of the forest
796 and querying minima or maxima on paths. Sleator and Tarjan have shown in \cite{sleator:trees}
797 how to do this in $\O(\log n)$ time amortized per operation, which leads to
798 an~implementation of the Dinic's maximum flow algorithm \cite{dinic:flow}
799 in time $\O(mn\log n)$.
801 %--------------------------------------------------------------------------------
803 \section{Verification in linear time}\id{verifysect}%
805 We have proven that $\O(m)$ edge weight comparisons suffice to verify minimality
806 of a~given spanning tree. Now we will show an~algorithm for the RAM
807 which finds the required comparisons in linear time. We will follow the idea
808 of King from \cite{king:verifytwo}, but as we have the power of the RAM data structures
809 from Section~\ref{bitsect} at our command, the low-level details will be easier,
810 especially the construction of vertex and edge labels.
813 First of all, let us make sure that the reduction to fully branching trees
814 in the Balancing lemma (\ref{verbranch}) can be made run in linear time. As already noticed
815 in the proof, the Bor\o{u}vka's algorithm runs in linear time. Constructing
816 the Bor\o{u}vka tree in the process adds at most a~constant overhead to every
817 step of the algorithm.
819 Finding the common ancestors is not trivial, but Harel and Tarjan have shown
820 in \cite{harel:nca} that linear time is sufficient on the RAM. Several more
821 accessible algorithms have been developed since then (see the Alstrup's survey
822 paper \cite{alstrup:nca} and a~particularly elegant algorithm described by Bender
823 and Falach-Colton in \cite{bender:lca}). Any of them implies the following
826 \thmn{Lowest common ancestors}\id{lcathm}%
827 On the RAM, it is possible to preprocess a~tree~$T$ in time $\O(n)$ and then
828 answer lowest common ancestor queries presented online in constant time.
831 The reductions in Lemma \ref{verbranch} can be performed in time $\O(m)$.
834 Having the balanced problem at hand, it remains to implement the procedure \<FindPeaks>
835 of Algorithm \ref{findpeaks} efficiently. We need a~compact representation of
836 the arrays $T_e$ and~$P_e$, which will allow to reduce the overhead of the algorithm
837 to time linear in the number of comparisons performed. To achieve
838 this goal, we will encode the arrays in RAM vectors (see Section \ref{bitsect}
839 for the vector operations).
843 \em{Vertex identifiers:} Since all vertices processed by the procedure
844 lie on the path from the root to the current vertex~$u$, we modify the algorithm
845 to keep a~stack of these vertices in an~array. We will often refer to each vertex by its
846 index in this array, i.e., by its depth. We will call these identifiers \df{vertex
847 labels} and we note that each label requires only $\ell=\lceil \log\lceil\log n\rceil\rceil$
848 bits. As every tree edge is uniquely identified by its bottom vertex, we can
849 use the same encoding for \df{edge labels.}
851 \em{Slots:} As we are going to need several operations which are not computable
852 in constant time on the RAM, we precompute tables for these operations
853 like we did in the Q-heaps (cf.~Lemma \ref{qhprecomp}). A~table for word-sized
854 arguments would take too much time to precompute, so we will generally store
855 our data structures in \df{slots} of $s=\lceil 1/3\cdot\log n\rceil$ bits each.
856 We will soon show that it is possible to precompute a~table of any reasonable
857 function whose arguments fit in two slots.
859 \em{Top masks:} The array~$T_e$ will be represented by a~bit mask~$M_e$ called the \df{top mask.} For each
860 of the possible tops~$t$ (i.e., the ancestors of the current vertex), we store
861 a~single bit telling whether $t\in T_e$. Each top mask fits in $\lceil\log n\rceil$
862 bits and therefore in a~single machine word. If needed, it can be split to three slots.
863 Unions and intersections of sets of tops then translate to $\band$/$\bor$
866 \em{Small and big lists:} The heaviest edge found so far for each top is stored
867 by the algorithm in the array~$P_e$. Instead of keeping the real array,
868 we store the labels of these edges in a~list encoded in a~bit string.
869 Depending on the size of the list, we use one of two possible encodings:
870 \df{Small lists} are stored in a~vector that fits in a~single slot, with
871 the unused fields filled by a~special constant, so that we can easily infer the
874 If the data do not fit in a~small list, we use a~\df{big list} instead. It
875 is stored in $\O(\log\log n)$ words, each of them containing a~slot-sized
876 vector. Unlike the small lists, we use the big lists as arrays. If a~top~$t$ of
877 depth~$d$ is active, we keep the corresponding entry of~$P_e$ in the $d$-th
878 field of the big list. Otherwise, we keep that entry unused.
880 We want to perform all operations on small lists in constant time,
881 but we can afford spending time $\O(\log\log n)$ on every big list. This
882 is true because whenever we use a~big list, $\vert T_e\vert = \Omega(\log n/\log\log n)$,
883 hence we need $\log\vert T_e\vert = \Omega(\log\log n)$ comparisons anyway.
885 \em{Pointers:} When we need to construct a~small list containing a~sub-list
886 of a~big list, we do not have enough time to see the whole big list. To handle
887 this, we introduce \df{pointers} as another kind of edge identifiers.
888 A~pointer is an~index to the nearest big list on the path from the small
889 list containing the pointer to the root. As each big list has at most $\lceil\log n\rceil$
890 fields, the pointer fits in~$\ell$ bits, but we need one extra bit to distinguish
891 between regular labels and pointers.
893 \lemman{Precomputation of tables}
894 When~$f$ is a~function of up to two arguments computable in polynomial time, we can
895 precompute a~table of the values of~$f$ for all values of arguments that fit
896 in a~single slot. The precomputation takes $\O(n)$ time.
899 Similar to the proof of Lemma \ref{qhprecomp}. There are $\O(2^{2s}) = \O(n^{2/3})$
900 possible values of arguments, so the precomputation takes time $\O(n^{2/3}\cdot\poly(s))
901 = \O(n^{2/3}\cdot\poly(\log n)) = \O(n)$.
905 As we can afford spending $\O(n)$ time on preprocessing,
906 we can assume that we can compute the following functions in constant time:
909 \:$\<Weight>(x)$ --- the Hamming weight of a~slot-sized number~$x$
910 (we already considered this operation in Algorithm \ref{lsbmsb}, but we needed
911 quadratic word size for it). We can easily extend this function to $\log n$-bit numbers
912 by splitting the number in three slots and adding their weights.
914 \:$\<FindKth>(x,k)$ --- the $k$-th set bit from the top of the slot-sized
915 number~$x$. Again, this can be extended to multi-slot numbers by calculating
916 the \<Weight> of each slot first and then finding the slot containing the
919 \:$\<Bits>(m)$ --- for a~slot-sized bit mask~$m$, it returns a~small list
920 of the positions of the bits set in~$\(m)$.
922 \:$\<Select>(x,m)$ --- constructs a~slot containing the substring of $\(x)$
923 selected by the bits set in~$\(m)$.
925 \:$\<SubList>(x,m)$ --- when~$x$ is a~small list and~$m$ a bit mask, it returns
926 a~small list containing the elements of~$x$ selected by the bits set in~$m$.
930 We will now show how to perform all parts of the procedure \<FindPeaks>
931 in the required time. We will denote the size of the tree by~$n$ and the
932 number of query paths by~$q$.
935 Depths of all vertices and all top masks can be computed in time $\O(n+q)$.
938 Run depth-first search on the tree, assign the depth of a~vertex when entering
939 it and construct its top mask when leaving it. The top mask can be obtained
940 by $\bor$-ing the masks of its sons, excluding the level of the sons and
941 including the tops of all query paths that have their bottoms at the current vertex
942 (the depths of the tops are already assigned).
946 The arrays $T_e$ and~$P_e$ can be indexed in constant time.
949 Indexing~$T_e$ is exactly the operation \<FindKth> applied on the corresponding
952 If $P_e$ is stored in a~big list, we calculate the index of the particular
953 slot and the position of the field inside the slot. This field can be then
954 extracted using bit masking and shifts.
956 If it is a~small list, we extract the field directly, but we have to
957 dereference it in case it is a pointer. We modify the recursion in \<FindPeaks>
958 to pass the depth of the lowest edge endowed with a~big list and when we
959 encounter a~pointer, we index this big list.
963 For an~arbitrary active top~$t$, the corresponding entry of~$P_e$ can be
964 extracted in constant time.
967 We look up the precomputed depth~$d$ of~$t$ first.
968 If $P_e$ is stored in a~big list, we extract the $d$-th entry of the list.
969 If the list is small, we find the position of the particular field
970 by counting bits of the top mask~$M_e$ at position~$d$ and higher
971 (this is \<Weight> of $M_e$ with the lower bits masked out).
975 \<FindPeaks> processes an~edge~$e$ in time $\O(\log \vert T_e\vert + q_e)$,
976 where $q_e$~is the number of query paths having~$e$ as its bottom edge.
979 The edge is examined in steps 1, 3, 4 and~5 of the algorithm. We will show how to
980 perform each of these steps in constant time if $P_e$ is a~small list or
981 $\O(\log\log n)$ if it is big.
983 \em{Step~1} looks up $q_e$~tops in~$P_e$ and we already know from Lemma \ref{verhe}
984 how to do that in constant time per top.
986 \em{Step~3} is trivial as we have already computed the top masks and we can
987 reconstruct the entries of~$T_e$ in constant time according to Lemma \ref{verth}.
989 \em{Step~5} involves binary search on~$P_e$ in $\O(\log\vert T_e\vert)$ comparisons,
990 each of them indexes~$P_e$, which is $\O(1)$ again by Lemma \ref{verth}. Rewriting the
991 lighter edges is $\O(1)$ for small lists by replication and bit masking, for a~big
992 list we do the same for each of its slots.
994 \em{Step~4} is the only non-trivial one. We already know which tops to select
995 (we have the top masks $M_e$ and~$M_p$ precomputed), but we have to carefully
997 We need to handle these four cases:
1000 \:\em{Small from small:} We use $\<Select>(T_e,T_p)$ to find the fields of~$P_p$
1001 that shall be deleted by a~subsequent call to \<SubList>. Pointers
1002 can be retained as they still refer to the same ancestor list.
1004 \:\em{Big from big:} We can copy the whole~$P_p$, since the layout of the
1005 big lists is fixed and the items, which we do not want, simply end up as unused
1008 \:\em{Small from big:} We use the operation \<Bits> to construct a~list
1009 of pointers (we use bit masking to add the ``this is a~pointer'' flags).
1011 \:\em{Big from small:} First we have to dereference the pointers in the
1012 small list~$S$. For each slot~$B_i$ of the ancestor big list, we construct
1013 a~subvector of~$S$ containing only the pointers referring to that slot,
1014 adjusted to be relative to the beginning of the slot (we use \<Compare>
1015 and \<Replicate> from Algorithm \ref{vecops} and bit masking). Then we
1016 use a~precomputed table to replace the pointers by the fields of~$B_i$
1017 they point to. We $\bor$ together the partial results and we again have
1020 Finally, we have to spread the fields of this small list to the whole big list.
1021 This is similar: for each slot of the big list, we find the part of the small
1022 list keeping the fields we want (we call \<Weight> on the sub-words of~$M_e$ before
1023 and after the intended interval of depths) and we use a~tabulated function
1024 to shift the fields to the right locations in the slot (controlled by the
1025 sub-word of~$M_e$ in the intended interval).
1029 \>We now have all the necessary ingredients to prove the following theorem
1030 and thus conclude this section:
1032 \thmn{Verification of MST on the RAM}\id{ramverify}%
1033 There is a~RAM algorithm which for every weighted graph~$G$ and its spanning tree~$T$
1034 determines whether~$T$ is minimum and finds all $T$-light edges in~$G$ in time $\O(m)$.
1037 Implement the Koml\'os's algorithm from Theorem \ref{verify} with the data
1038 structures developed in this section.
1039 According to Lemma \ref{verfh}, the algorithm runs in time $\sum_e \O(\log\vert T_e\vert + q_e)
1040 = \O(\sum_e \log\vert T_e\vert) + \O(\sum_e q_e)$. The second sum is $\O(m)$
1041 as there are $\O(1)$ query paths per edge, the first sum is $\O(\#\hbox{comparisons})$,
1042 which is $\O(m)$ by Theorem \ref{verify}.
1045 \>In Section \ref{kbestsect}, we will need a~more specialized statement:
1048 There is a~RAM algorithm which for every weighted tree~$T$ and a~set~$P$ of
1049 paths in~$T$ calculates the peaks of these paths in time $\O(n(T) + \vert P\vert)$.
1051 \paran{Verification on the Pointer Machine}\id{pmverify}%
1052 Buchsbaum et al.~\cite{buchsbaum:verify} have recently shown that linear-time
1053 verification can be achieved even on the Pointer Machine. They first solve the
1054 problem of finding the lowest common ancestors for a~set of pairs of vertices
1055 by batch processing: They combine an~algorithm of time complexity $\O(m\timesalpha(m,n))$
1056 based on the Disjoint Set Union data structure with the framework of topological graph
1057 computations described in Section \ref{bucketsort}. Then they use a~similar
1058 technique for finding the peaks themselves.
1060 \paran{Online verification}%
1061 The online version of this problem has turned out to be more difficult. It calls for an~algorithm
1062 that preprocesses the tree and then answers queries for peaks of paths presented online. Pettie
1063 \cite{pettie:onlineverify} has proven an~interesting lower bound based on the inverses of the
1064 Ackermann's function. If we want to answer queries within $t$~comparisons, we
1065 have to invest $\Omega(n\log\lambda_t(n))$ time into preprocessing.\foot{$\lambda_t(n)$ is the
1066 $t$-th row inverse of the Ackermann's function, $\alpha(n)$ is its diagonal inverse. See
1067 \ref{ackerinv} for the exact definitions.} This implies that with
1068 preprocessing in linear time, the queries require $\Omega(\alpha(n))$ time.
1070 %--------------------------------------------------------------------------------
1072 \section{A randomized algorithm}\id{randmst}%
1074 When we analysed the Contractive Bor\o{u}vka's algorithm in Section~\ref{contalg},
1075 we observed that while the number of vertices per iteration decreases exponentially,
1076 the number of edges generally does not, so we spend $\Theta(m)$ time on every phase.
1077 Karger, Klein and Tarjan \cite{karger:randomized} have overcome this problem by
1078 combining the Bor\o{u}vka's algorithm with filtering based on random sampling.
1079 This leads to a~randomized algorithm which runs in linear expected time.
1081 The principle of the filtering is simple: Let us consider any spanning tree~$T$
1082 of the input graph~$G$. Each edge of~$G$ that is $T$-heavy is the heaviest edge
1083 of some cycle, so by the Red lemma (\ref{redlemma}) it cannot participate in
1084 the MST of~$G$. We can therefore discard all $T$-heavy edges and continue with
1085 finding the MST on the reduced graph. Of course, not all choices of~$T$ are equally
1086 good, but it will soon turn out that when we take~$T$ as the MST of a~randomly selected
1087 subgraph, only a~small expected number of edges remains.
1089 Selecting a~subgraph at random will unavoidably produce disconnected subgraphs
1090 at occasion, so we will drop the implicit assumption that all graphs are
1091 connected for this section and we will always search for the minimum spanning forest.
1092 As we already noted (\ref{disconn}), with a~little bit of care our
1093 algorithms and theorems keep working.
1095 Since we need the MST verification algorithm for finding the $T$-heavy edges,
1096 we will assume that we are working on the RAM.
1098 \lemman{Random sampling, Karger \cite{karger:sampling}}\id{samplemma}%
1099 Let $H$~be a~subgraph of~$G$ obtained by including each edge independently
1100 with probability~$p$. Let further $F$~be the minimum spanning forest of~$H$. Then the
1101 expected number of $F$-nonheavy\foot{That is, $F$-light edges and also edges of~$F$ itself.}
1102 edges in~$G$ is at most $n/p$.
1105 Let us observe that we can obtain the forest~$F$ by running the Kruskal's algorithm
1106 (\ref{kruskal}) combined with the random process producing~$H$ from~$G$. We sort all edges of~$G$
1107 by their weights and we start with an~empty forest~$F$. For each edge, we first
1108 flip a~biased coin (that gives heads with probability~$p$) and if it comes up
1109 tails, we discard the edge. Otherwise we perform a~single step of the Kruskal's
1110 algorithm: We check whether $F+e$ contains a~cycle. If it does, we discard~$e$, otherwise
1111 we add~$e$ to~$F$. At the end, we have produced the subgraph~$H$ and its MSF~$F$.
1113 When we exchange the check for cycles with flipping the coin, we get an~equivalent
1114 algorithm which will turn out to be more convenient to analyse:
1116 \:If $F+e$ contains a~cycle, we immediately discard~$e$ (we can flip
1117 the coin, but we need not to, because the edge will be discarded regardless of
1118 the outcome). We note that~$e$ is $F$-heavy with respect to both the
1119 current state of~$F$ and the final MSF.
1120 \:If $F+e$ is acyclic, we flip the coin:
1121 \::If it comes up heads, we add~$e$ to~$F$. In this case, $e$~is neither $F$-light
1123 \::If it comes up tails, we discard~$e$. Such edges are $F$-light.
1126 The number of $F$-nonheavy edges is therefore equal to the total number of the coin
1127 flips in step~2 of this algorithm. We also know that the algorithm stops before
1128 it adds $n$~edges to~$F$. Therefore it flips at most as many coins as a~simple
1129 random process that repeatedly flips until it gets~$n$ heads. As waiting for
1130 every occurrence of heads takes expected time~$1/p$ (the distribution is geometric),
1131 waiting for~$n$ heads must take $n/p$. This is the bound we wanted to achieve.
1135 We will formulate the algorithm as a~doubly-recursive procedure. It alternatively
1136 performs steps of the Bor\o{u}vka's algorithm and filtering based on the above lemma.
1137 The first recursive call computes the MSF of the sampled subgraph, the second one
1138 finds the MSF of the original graph, but without the heavy edges.
1140 As in all contractive algorithms, we use edge labels to keep track of the
1141 original locations of the edges in the input graph. For the sake of simplicity,
1142 we do not mention it in the algorithm explicitly.
1144 \algn{MSF by random sampling --- the KKT algorithm}\id{kkt}%
1146 \algin A~graph $G$ with an~edge comparison oracle.
1147 \:Remove isolated vertices from~$G$. If no vertices remain, stop and return an~empty forest.
1148 \:Perform two Bor\o{u}vka steps (iterations of Algorithm \ref{contbor}) on~$G$ and
1149 remember the set~$B$ of the edges having been contracted.
1150 \:Select a~subgraph~$H\subseteq G$ by including each edge independently with
1152 \:$F\=\msf(H)$ calculated recursively.
1153 \:Construct $G'\subseteq G$ by removing all $F$-heavy edges of~$G$.
1154 \:$R\=\msf(G')$ calculated recursively.
1156 \algout The minimum spanning forest of~$G$.
1160 Let us analyse the time complexity of this algorithm by studying properties of its \df{recursion tree.}
1161 This tree describes the subproblems processed by the recursive calls. For any vertex~$v$
1162 of the tree, we denote the number of vertices and edges of the corresponding subproblem~$G_v$
1163 by~$n_v$ and~$m_v$ respectively.
1164 If $m_v>0$, the recursion continues: the left son of~$v$ corresponds to the
1165 call on the sampled subgraph~$H_v$, the right son to the reduced graph~$G^\prime_v$.
1166 (Similarly, we use letters subscripted with~$v$ for the state of the other variables
1168 The root of the recursion tree is obviously the original graph~$G$, the leaves are
1169 trivial graphs with no edges.
1172 The Bor\o{u}vka steps together with the removal of isolated vertices guarantee that the number
1173 of vertices drops at least by a~factor of four in every recursive call. The size of a~subproblem~$G_v$
1174 at level~$i$ is therefore at most $n/4^i$ and the depth of the tree is at most $\lceil\log_4 n\rceil$.
1175 As there are no more than~$2^i$ subproblems at level~$i$, the sum of all~$n_v$'s
1176 on that level is at most $n/2^i$, which is at most~$2n$ when summed over the whole tree.
1178 We are going to show that the worst case of the KKT algorithm is not worse than
1179 of the plain contractive algorithm, while the average case is linear.
1182 For every subproblem~$G_v$, the KKT algorithm spends $\O(m_v+n_v)$ time plus the cost
1183 of the recursive calls.
1186 We know from Lemma \ref{contiter} that each Bor\o{u}vka step takes time $\O(m_v+n_v)$.\foot{We
1187 need to add $n_v$, because the graph could be disconnected.}
1188 The selection of the edges of~$H_v$ is straightforward.
1189 Finding the $F_v$-heavy edges is not, but we have already shown in Theorem \ref{ramverify}
1190 that linear time is sufficient on the RAM.
1193 \thmn{Worst-case complexity of the KKT algorithm}
1194 The KKT algorithm runs in time $\O(\min(n^2,m\log n))$ in the worst case on the RAM.
1197 The argument for the $\O(n^2)$ bound is similar to the analysis of the plain
1198 contractive algorithm. As every subproblem~$G_v$ is a~simple graph, the number
1199 of its edges~$m_v$ is less than~$n_v^2$. By the previous lemma, we spend time
1200 $\O(n_v^2)$ on it. Summing over all subproblems yields $\sum_v \O(n_v^2) =
1201 \O((\sum_v n_v)^2) = \O(n^2)$.
1203 In order to prove the $\O(m\log n)$ bound, it is sufficient to show that the total time
1204 spent on every level of the recursion tree is $\O(m)$. Suppose that $v$~is a~vertex
1205 of the recursion tree with its left son~$\ell$ and right son~$r$. Some edges of~$G_v$
1206 are removed in the Bor\o{u}vka steps, let us denote their number by~$b_v$.
1207 The remaining edges fall either to~$G_\ell = H_v$, or to $G_r = G^\prime_v$, or possibly
1210 We can observe that the intersection $G_\ell\cap G_r$ cannot be large: The edges of~$H_v$ that
1211 are not in the forest~$F_v$ are $F_v$-heavy, so they do not end up in~$G_r$. Therefore the
1212 intersection can contain only the edges of~$F_v$. As there are at most $n_v/4$ such edges,
1213 we have $m_\ell + m_r + b_v \le m_v + n_v/4$.
1215 On the other hand, the first Bor\o{u}vka step selects at least $n_v/2$ edges,
1216 so $b_v \ge n_v/2$. The duplication of edges between $G_\ell$ and~$G_r$ is therefore
1217 compensated by the loss of edges by contraction and $m_\ell + m_r \le m_v$. So the total
1218 number of edges per level does not decrease and it remains to apply the previous lemma.
1221 \thmn{Expected complexity of the KKT algorithm}\id{kktavg}%
1222 The expected time complexity of the KKT algorithm on the RAM is $\O(m)$.
1225 The structure of the recursion tree depends on the random choices taken,
1226 but as its worst-case depth is at most~$\lceil \log_4 n\rceil$, the tree
1227 is always a~subtree of the complete binary tree of that depth. We will
1228 therefore prove the theorem by examining the complete tree, possibly with
1229 empty subproblems in some vertices.
1231 The left edges of the tree (edges connecting a~parent with its left
1232 son) form a~set of \df{left paths.} Let us consider the expected time spent on
1233 a~single left path. When walking the path downwards from its top vertex~$r$,
1234 the expected size of the subproblems decreases exponentially: for a~son~$\ell$
1235 of a~vertex~$v$, we have $n_\ell \le n_v/4$ and $\E m_\ell = \E m_v/2$. The
1236 expected total time spend on the path is therefore $\O(n_r+m_r)$ and it remains
1237 to sum this over all left paths.
1239 With the exception of the path going from the root of the tree,
1240 the top~$r$ of a~left path is always a~right son of a~unique parent vertex~$v$.
1241 Since the subproblem~$G_r$ has been obtained from its parent subproblem~$G_v$
1242 by filtering out all heavy edges, we can use the Sampling lemma (\ref{samplemma}) to show that
1243 $\E m_r \le 2n_v$. The sum of the expected sizes of all top subproblems is
1244 then $\sum_r n_r + m_r \le \sum_v 3n_v = \O(n)$. After adding the exceptional path
1245 from the root, we get $\O(m+n)=\O(m)$.
1248 \paran{High probability}%
1249 There is also a~high-probability version of the above theorem. According to
1250 Karger, Klein and Tarjan \cite{karger:randomized}, the time complexity
1251 of the algorithm is $\O(m)$ with probability $1-\exp(-\Omega(m))$. The proof
1252 again follows the recursion tree and it involves applying the Chernoff bound
1253 \cite{chernoff} to bound the tail probabilities.
1255 \paran{Different sampling}%
1256 We could also use a~slightly different formulation of the Sampling lemma
1257 suggested by Chan \cite{chan:backward}. He changes the selection of the subgraph~$H$
1258 to choosing an~$mp$-edge subset of~$E(G)$ uniformly at random. The proof is then
1259 a~straightforward application of the backward analysis method. We however preferred
1260 the Karger's original version, because generating a~random subset of a~given size
1261 requires an~unbounded number of random bits in the worst case.
1263 \paran{On the Pointer Machine}%
1264 The only place where we needed the power of the RAM is finding the heavy edges,
1265 so we can employ the pointer-machine verification algorithm mentioned in \ref{pmverify}
1266 to bring the results of this section to the~PM.