]> mj.ucw.cz Git - saga.git/blob - adv.tex
Online verification is hard.
[saga.git] / adv.tex
1 \ifx\endpart\undefined
2 \input macros.tex
3 \fi
4
5 \chapter{Advanced MST Algorithms}
6
7 \section{Minor-closed graph classes}\id{minorclosed}%
8
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 the algorithm is still efficient?
12 The right context turns out to be the minor-closed graph classes, which are
13 closed under contractions and have bounded density.
14
15 \defn\id{minordef}%
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}).
18
19 \defn
20 A~class~$\cal C$ of graphs is \df{minor-closed}, when for every $G\in\cal C$ and
21 its every minor~$H$, 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$.
23
24 \example
25 Non-trivial minor-closed classes include:
26 \itemize\ibull
27 \:planar graphs,
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.
31 \endlist
32
33 \para
34 Many of the nice structural properties of planar graphs extend to
35 minor-closed classes, too (see \cite{lovasz:minors} for a~nice survey
36 of this theory and \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.
39
40 \defn
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)$.
45
46 \obs
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.
56
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})$.
60
61 \proof
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.
65 \qed
66
67 \para
68 For analysis of the contractive algorithm,
69 we will make use of another important property --- the bounded density of
70 minor-closed classes. The connection between minors and density dates back to
71 Mader in the 1960's and it can be proven without use of the Robertson-Seymour
72 theorem.
73
74 \defn\id{density}%
75 Let $\cal C$ be a class of graphs. We define its \df{edge density} $\varrho(\cal C)$
76 to be the infimum of all~$\varrho$'s such that $m(G) \le \varrho\cdot n(G)$
77 holds for every $G\in\cal C$.
78
79 \thmn{Mader \cite{mader:dens}}
80 For every $k\in{\bb N}$ there exists $h(k)\in{\bb R}$ such that every graph
81 of average degree at least~$h(k)$ contains a~subdivision of~$K_{k}$ as a~subgraph.
82
83 \proofsketch
84 (See Lemma 3.5.1 in \cite{diestel:gt} for a~complete proof in English.)
85
86 Let us fix~$k$ and prove by induction on~$m$ that every graph of average
87 degree at least~$2^m$ contains a~subdivision of some graph with $k$~vertices
88 and ${k\choose 2}\ge m\ge k$~edges. For $m={k\choose 2}$ the theorem follows
89 as the only graph with~$k$ vertices and~$k\choose 2$ edges is~$K_k$.
90
91 The base case $m=k$: Let us observe that when the average degree
92 is~$a$, removing any vertex of degree less than~$a/2$ does not decrease the
93 average degree. A~graph with $a\ge 2^k$ therefore has a~subgraph
94 with minimum degree $\delta\ge a/2=2^{k-1}$. Such subgraph contains
95 a~cycle on more than~$\delta$ vertices, in other words a~subdivision of
96 the cycle~$C_k$.
97
98 Induction step: Let~$G$ be a~graph with average degree at least~$2^m$ and
99 assume that the theorem already holds for $m-1$. Without loss of generality,
100 $G$~is connected. Consider a~maximal set $U\subseteq V$ such that the subgraph $G[U]$
101 induced by~$U$ is connected and the graph $G.U$ ($G$~with $U$~contracted to
102 a~single vertex) has average degree at least~$2^m$ (such~$U$ exists, because
103 $G=G.U$ whenever $\vert U\vert=1$). Now consider the subgraph~$H$ induced
104 in~$G$ by the neighbors of~$U$. Every $v\in V(H)$ must have $\deg_H(v) \ge 2^{m-1}$,
105 as otherwise we can add this vertex to~$U$, contradicting its
106 maximality. By the induction hypothesis, $H$ contains a~subdivision of some
107 graph~$R$ with $r$~vertices and $m-1$ edges. Any two non-adjacent vertices
108 of~$R$ can be connected in the subdivision by a~path lying entirely in~$G[U]$,
109 which reveals a~subdivision of a~graph with $m$~edges. \qed
110
111 \thmn{Density of minor-closed classes, Mader~\cite{mader:dens}}
112 Every non-trivial minor-closed class of graphs has finite edge density.
113
114 \proof
115 Let~$\cal C$ be any such class, $X$~its smallest excluded minor and $x=n(X)$.
116 As $H\minorof K_x$, the class $\cal C$ entirely lies 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$.
119
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.
124 \qed
125
126 \rem
127 Minor-closed classes share many other interesting properties, for example bounded chromatic
128 numbers of various kinds, as shown by Theorem 6.1 of \cite{nesetril:minors}.
129
130 Let us return to the analysis of our algorithm.
131
132 \thmn{MST on minor-closed classes \cite{mm:mst}}\id{mstmcc}%
133 For any fixed non-trivial minor-closed class~$\cal C$ of graphs, the Contractive Bor\o{u}vka's
134 algorithm (\ref{contbor}) finds the MST of any graph of this class in time
135 $\O(n)$. (The constant hidden in the~$\O$ depends on the class.)
136
137 \proof
138 Following the proof for planar graphs (\ref{planarbor}), we denote the graph considered
139 by the algorithm at the beginning of the $i$-th iteration by~$G_i$ and its number of vertices
140 and edges by $n_i$ and $m_i$ respectively. Again the $i$-th phase runs in time $\O(m_i)$
141 and $n_i \le n/2^i$, so it remains to show a linear bound for the $m_i$'s.
142
143 Since each $G_i$ is produced from~$G_{i-1}$ by a sequence of edge contractions,
144 all $G_i$'s are minors of~$G$.\foot{Technically, these are multigraph contractions,
145 but followed by flattening, so they are equivalent to contractions on simple graphs.}
146 So they also belong to~$\cal C$ and by the previous theorem $m_i\le \varrho({\cal C})\cdot n_i$.
147 \qed
148
149 \paran{Local contractions}\id{nobatch}%
150 The contractive algorithm uses ``batch processing'' to perform many contractions
151 in a single step. It is also possible to perform contractions one edge at a~time,
152 batching only the flattenings. A~contraction of an edge~$uv$ can be done
153 in time~$\O(\deg(u))$ by removing all edges incident with~$u$ and inserting them back
154 with $u$ replaced by~$v$. Therefore we need to find a lot of vertices with small
155 degrees. The following lemma shows that this is always the case in minor-closed
156 classes.
157
158 \lemman{Low-degree vertices}\id{lowdeg}%
159 Let $\cal C$ be a graph class with density~$\varrho$ and $G\in\cal C$ a~graph
160 with $n$~vertices. Then at least $n/2$ vertices of~$G$ have degree at most~$4\varrho$.
161
162 \proof
163 Assume the contrary: Let there be at least $n/2$ vertices with degree
164 greater than~$4\varrho$.  Then $\sum_v \deg(v) > n/2
165 \cdot 4\varrho = 2\varrho n$, which is in contradiction with the number
166 of edges being at most $\varrho n$.
167 \qed
168
169 \rem
170 The proof can be also viewed
171 probabilistically: let $X$ be the degree of a vertex of~$G$ chosen uniformly at
172 random. Then $\E X \le 2\varrho$, hence by the Markov's inequality
173 ${\rm Pr}[X > 4\varrho] < 1/2$, so for at least $n/2$ vertices~$v$ we have
174 $\deg(v)\le 4\varrho$.
175
176 \algn{Local Bor\o{u}vka's Algorithm, Mare\v{s} \cite{mm:mst}}%
177 \algo
178 \algin A~graph~$G$ with an edge comparison oracle and a~parameter~$t\in{\bb N}$.
179 \:$T\=\emptyset$.
180 \:$\ell(e)\=e$ for all edges~$e$.
181 \:While $n(G)>1$:
182 \::While there exists a~vertex~$v$ such that $\deg(v)\le t$:
183 \:::Select the lightest edge~$e$ incident with~$v$.
184 \:::Contract~$G$ along~$e$.
185 \:::$T\=T + \ell(e)$.
186 \::Flatten $G$, removing parallel edges and loops.
187 \algout Minimum spanning tree~$T$.
188 \endalgo
189
190 \thm
191 When $\cal C$ is a minor-closed class of graphs with density~$\varrho$, the
192 Local Bor\o{u}vka's Algorithm with the parameter~$t$ set to~$4\varrho$ 
193 finds the MST of any graph from this class in time $\O(n)$. (The constant
194 in the~$\O$ depends on~the class.)
195
196 \proof
197 Let us denote by $G_i$, $n_i$ and $m_i$ the graph considered by the
198 algorithm at the beginning of the $i$-th iteration of the outer loop,
199 and the number of its vertices and edges respectively. As in the proof
200 of the previous algorithm (\ref{mstmcc}), we observe that all the $G_i$'s
201 are minors of the graph~$G$ given as the input.
202
203 For the choice $t=4\varrho$, the Lemma on low-degree vertices (\ref{lowdeg})
204 guarantees that at the beginning of the $i$-th iteration, at least $n_i/2$ vertices
205 have degree at most~$t$. Each selected edge removes one such vertex and
206 possibly increases the degree of another, so at least $n_i/4$ edges get selected.
207 Hence $n_i\le 3/4\cdot n_{i-1}$ and therefore $n_i\le n\cdot (3/4)^i$ and the
208 algorithm terminates after $\O(\log n)$ iterations.
209
210 Each selected edge belongs to $\mst(G)$, because it is the lightest edge of
211 the trivial cut $\delta(v)$ (see the Blue Rule in \ref{rbma}).
212 The steps 6 and~7 therefore correspond to the operation
213 described by the Lemma on contraction of MST edges (\ref{contlemma}) and when
214 the algorithm stops, $T$~is indeed the minimum spanning tree.
215
216 It remains to analyse the time complexity of the algorithm. Since $G_i\in{\cal C}$, we have
217 $m_i\le \varrho n_i \le \varrho n/2^i$.
218 We will show that the $i$-th iteration is carried out in time $\O(m_i)$.
219 Steps 5 and~6 run in time $\O(\deg(v))=\O(t)$ for each~$v$, so summed
220 over all $v$'s they take $\O(tn_i)$, which is linear for a fixed class~$\cal C$.
221 Flattening takes $\O(m_i)$, as already noted in the analysis of the Contracting
222 Bor\o{u}vka's Algorithm (see \ref{contiter}).
223
224 The whole algorithm therefore runs in time $\O(\sum_i m_i) = \O(\sum_i n/2^i) = \O(n)$.
225 \qed
226
227 \paran{Back to planar graphs}%
228 For planar graphs, we can get a sharper version of the low-degree lemma,
229 showing that the algorithm works with $t=8$ as well (we had $t=12$ as
230 $\varrho=3$). While this does not change the asymptotic time complexity
231 of the algorithm, the constant-factor speedup can still delight the hearts of
232 its practical users.
233
234 \lemman{Low-degree vertices in planar graphs}%
235 Let $G$ be a planar graph with $n$~vertices. Then at least $n/2$ vertices of~$v$
236 have degree at most~8.
237
238 \proof
239 It suffices to show that the lemma holds for triangulations (if there
240 are any edges missing, the situation can only get better) with at
241 least 3 vertices. Since $G$ is planar, $\sum_v \deg(v) < 6n$.
242 The numbers $d(v):=\deg(v)-3$ are non-negative and $\sum_v d(v) < 3n$,
243 so by the same argument as in the proof of the general lemma, for at least $n/2$
244 vertices~$v$ it holds that $d(v) < 6$, hence $\deg(v) \le 8$.
245 \qed
246
247 \rem\id{hexa}%
248 The constant~8 in the previous lemma is the best we can have.
249 Consider a $k\times k$ triangular grid. It has $n=k^2$ vertices, $\O(k)$ of them
250 lie on the outer face and have degrees at most~6, the remaining $n-\O(k)$ interior
251 vertices have degree exactly~6. Therefore the number of faces~$f$ is $6/3\cdot n=2n$,
252 ignoring terms of order $\O(k)$. All interior triangles can be properly colored with
253 two colors, black and white. Now add a~new vertex inside each white face and connect
254 it to all three vertices on the boundary of that face. This adds $f/2 \approx n$
255 vertices of degree~3 and it increases the degrees of the original $\approx n$ interior
256 vertices to~9, therefore about a half of the vertices of the new planar graph
257 has degree~9.
258
259 \figure{hexangle.eps}{\epsfxsize}{The construction from Remark~\ref{hexa}}
260
261 \rem
262 The observation in~Theorem~\ref{mstmcc} was also independently made by Gustedt in~\cite{gustedt:parallel}
263 who studied a~parallel version of the contractive Bor\o{u}vka's algorithm applied
264 to minor-closed classes.
265
266 %--------------------------------------------------------------------------------
267
268 \section{Using Fibonacci heaps}
269 \id{fibonacci}
270
271 We have seen that the Jarn\'\i{}k's Algorithm \ref{jarnik} runs in $\Theta(m\log n)$ time.
272 Fredman and Tarjan have shown a~faster implementation in~\cite{ft:fibonacci}
273 using their Fibonacci heaps. In this section, we convey their results and we
274 show several interesting consequences.
275
276 The previous implementation of the algorithm used a binary heap to store all edges
277 separating the current tree~$T$ from the rest of the graph, i.e., edges of the cut~$\delta(T)$.
278 Instead of that, we will remember the vertices adjacent to~$T$ and for each such vertex~$v$ we
279 will maintain the lightest edge~$uv$ such that $u$~lies in~$T$. We will call these edges \df{active edges}
280 and keep them in a~Fibonacci heap, ordered by weight.
281
282 When we want to extend~$T$ by the lightest edge of~$\delta(T)$, it is sufficient to
283 find the lightest active edge~$uv$ and add this edge to~$T$ together with the new vertex~$v$.
284 Then we have to update the active edges as follows. The edge~$uv$ has just ceased to
285 be active. We scan all neighbors~$w$ of the vertex~$v$. When $w$~is in~$T$, no action
286 is needed. If $w$~is outside~$T$ and it was not adjacent to~$T$ (there is no active edge
287 remembered for it so far), we set the edge~$vw$ as active. Otherwise we check the existing
288 active edge for~$w$ and replace it by~$vw$ if the new edge is lighter.
289
290 The following algorithm shows how these operations translate to insertions, decreases
291 and deletions on the heap.
292
293 \algn{Active Edge Jarn\'\i{}k; Fredman and Tarjan \cite{ft:fibonacci}}\id{jarniktwo}%
294 \algo
295 \algin A~graph~$G$ with an edge comparison oracle.
296 \:$v_0\=$ an~arbitrary vertex of~$G$.
297 \:$T\=$ a tree containing just the vertex~$v_0$.
298 \:$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)$, initially empty.
299 \:$A\=$ a~mapping of vertices outside~$T$ to their active edges in the heap; initially all elements undefined.
300 \:\<Insert> all edges incident with~$v_0$ to~$H$ and update~$A$ accordingly.
301 \:While $H$ is not empty:
302 \::$(u,v)\=\<DeleteMin>(H)$.
303 \::$T\=T+uv$.
304 \::For all edges $vw$ such that $w\not\in T$:
305 \:::If there exists an~active edge~$A(w)$:
306 \::::If $vw$ is lighter than~$A(w)$, \<Decrease> $A(w)$ to~$(v,w)$ in~$H$.
307 \:::If there is no such edge, then \<Insert> $(v,w)$ to~$H$ and set~$A(w)$.
308 \algout Minimum spanning tree~$T$.
309 \endalgo
310
311 \para
312 To analyze the time complexity of this algorithm, we will use the standard
313 theorem on~complexity of the Fibonacci heap:
314
315 \thmn{Fibonacci heaps, Fredman and Tarjan \cite{ft:fibonacci}} The~Fibonacci heap performs the following operations
316 with the indicated amortized time complexities:
317 \itemize\ibull
318 \:\<Insert> (insertion of a~new element) in $\O(1)$,
319 \:\<Decrease> (decreasing value of an~existing element) in $\O(1)$,
320 \:\<Merge> (merging of two heaps into one) in $\O(1)$,
321 \:\<DeleteMin> (deletion of the minimal element) in $\O(\log n)$,
322 \:\<Delete> (deletion of an~arbitrary element) in $\O(\log n)$,
323 \endlist
324 \>where $n$ is the number of elements present in the heap at the time of
325 the operation.
326
327 \proof
328 See Fredman and Tarjan \cite{ft:fibonacci} for both the description of the Fibonacci
329 heap and the proof of this theorem.
330 \qed
331
332 \thm
333 Algorithm~\ref{jarniktwo} with the Fibonacci heap finds the MST of the input graph in time~$\O(m+n\log n)$.
334
335 \proof
336 The algorithm always stops, because every edge enters the heap~$H$ at most once.
337 As it selects exactly the same edges as the original Jarn\'\i{}k's algorithm,
338 it gives the correct answer.
339
340 The time complexity is $\O(m)$ plus the cost of the heap operations. The algorithm
341 performs at most one \<Insert> or \<Decrease> per edge and exactly one \<DeleteMin>
342 per vertex. There are at most $n$ elements in the heap at any given time,
343 thus by the previous theorem the operations take $\O(m+n\log n)$ time in total.
344 \qed
345
346 \cor
347 For graphs with edge density at least $\log n$, this algorithm runs in linear time.
348
349 \remn{Other heaps}%
350 We can consider using other kinds of heaps that have the property that inserts
351 and decreases are faster than deletes. Of course, the Fibonacci heaps are asymptotically
352 optimal (by the standard $\Omega(n\log n)$ lower bound on sorting by comparisons, see
353 for example \cite{clrs}), so the other data structures can improve only
354 multiplicative constants or offer an~easier implementation.
355
356 A~nice example is a~\df{$d$-regular heap} --- a~variant of the usual binary heap
357 in the form of a~complete $d$-regular tree. \<Insert>, \<Decrease> and other operations
358 involving bubbling the values up spend $\O(1)$ time at a~single level, so they run
359 in~$\O(\log_d n)$ time. \<Delete> and \<DeleteMin> require bubbling down, which incurs
360 comparison with all~$d$ sons at every level, so they spend $\O(d\log_d n)$.
361 With this structure, the time complexity of the whole algorithm
362 is $\O(nd\log_d n + m\log_d n)$, which suggests setting $d=m/n$, yielding $\O(m\log_{m/n}n)$.
363 This is still linear for graphs with density at~least~$n^{1+\varepsilon}$.
364
365 Another possibility is to use the 2-3-heaps \cite{takaoka:twothree} or Trinomial
366 heaps \cite{takaoka:trinomial}. Both have the same asymptotic complexity as Fibonacci
367 heaps (the latter even in the worst case, but it does not matter here) and their
368 authors claim faster implementation. For integer weights, we can use Thorup's priority
369 queues described in \cite{thorup:pqsssp} which have constant-time \<Insert> and \<Decrease>
370 and $\O(\log\log n)$ time \<DeleteMin>. (We will however omit the details since we will
371 show a~faster integer algorithm soon.)
372
373 \paran{Combining MST algorithms}%
374 As we already noted, the improved Jarn\'\i{}k's algorithm runs in linear time
375 for sufficiently dense graphs. In some cases, it is useful to combine it with
376 another MST algorithm, which identifies a~part of the MST edges and contracts
377 the graph to increase its density. For example, we can perform several
378 iterations of the Contractive Bor\o{u}vka's algorithm and find the rest of the
379 MST by the Active Edge Jarn\'\i{}k's algorithm.
380
381 \algn{Mixed Bor\o{u}vka-Jarn\'\i{}k}
382 \algo
383 \algin A~graph~$G$ with an edge comparison oracle.
384 \:Run $\log\log n$ iterations of the Contractive Bor\o{u}vka's algorithm (\ref{contbor}),
385   getting a~MST~$T_1$.
386 \:Run the Active Edge Jarn\'\i{}k's algorithm (\ref{jarniktwo}) on the resulting
387   graph, getting a~MST~$T_2$.
388 \:Combine $T_1$ and~$T_2$ to~$T$ as in the Contraction lemma (\ref{contlemma}).
389 \algout Minimum spanning tree~$T$.
390 \endalgo
391
392 \thm
393 The Mixed Bor\o{u}vka-Jarn\'\i{}k algorithm finds the MST of the input graph in time $\O(m\log\log n)$.
394
395 \proof
396 Correctness follows from the Contraction lemma and from the proofs of correctness of the respective algorithms.
397 As~for time complexity: The first step takes $\O(m\log\log n)$ time
398 (by Lemma~\ref{contiter}) and it gradually contracts~$G$ to a~graph~$G'$ of size
399 $m'\le m$ and $n'\le n/\log n$. The second step then runs in time $\O(m'+n'\log n') = \O(m)$
400 and both trees can be combined in linear time, too.
401 \qed
402
403 \paran{Iterating Jarn\'\i{}k's algorithm}%
404 Actually, there is a~much better choice of the algorithms to combine: use the
405 Active Edge Jarn\'\i{}k's algorithm multiple times, each time stopping after a~while.
406 A~good choice of the stopping condition is to place a~limit on the size of the heap.
407 We start with an~arbitrary vertex, grow the tree as usually and once the heap gets too large,
408 we conserve the current tree and start with a~different vertex and an~empty heap. When this
409 process runs out of vertices, it has identified a~sub-forest of the MST, so we can
410 contract the graph along the edges of~this forest and iterate.
411
412 \algn{Iterated Jarn\'\i{}k; Fredman and Tarjan \cite{ft:fibonacci}}\id{itjar}%
413 \algo
414 \algin A~graph~$G$ with an edge comparison oracle.
415 \:$T\=\emptyset$. \cmt{edges of the MST}
416 \:$\ell(e)\=e$ for all edges~$e$. \cmt{edge labels as usually}
417 \:$m_0\=m$.
418 \:While $n>1$: \cmt{We will call iterations of this loop \df{phases}.}
419 \::$F\=\emptyset$. \cmt{forest built in the current phase}
420 \::$t\=2^{\lceil 2m_0/n \rceil}$. \cmt{the limit on heap size}
421 \::While there is a~vertex $v_0\not\in F$:
422 \:::Run the Active Edge Jarn\'\i{}k's algorithm (\ref{jarniktwo}) from~$v_0$, stop when:
423 \::::all vertices have been processed, or
424 \::::a~vertex of~$F$ has been added to the tree, or
425 \::::the heap has grown to more than~$t$ elements.
426 \:::Denote the resulting tree~$R$.
427 \:::$F\=F\cup R$.
428 \::$T\=T\cup \ell[F]$. \cmt{Remember MST edges found in this phase.}
429 \::Contract~$G$ along all edges of~$F$ and flatten it.
430 \algout Minimum spanning tree~$T$.
431 \endalgo
432
433 \nota
434 For analysis of the algorithm, let us denote the graph entering the $i$-th
435 phase by~$G_i$ and likewise with the other parameters. Let the trees from which
436 $F_i$~has been constructed be called $R_i^1, \ldots, R_i^{z_i}$. The
437 non-indexed $G$, $m$ and~$n$ will correspond to the graph given as~input.
438
439 \para
440 However the choice of the parameter~$t$ can seem mysterious, the following
441 lemma makes the reason clear:
442
443 \lemma\id{ijphase}%
444 The $i$-th phase of the Iterated Jarn\'\i{}k's algorithm runs in time~$\O(m)$.
445
446 \proof
447 During the phase, the heap always contains at most~$t_i$ elements, so it takes
448 time~$\O(\log t_i)=\O(m/n_i)$ to delete an~element from the heap. The trees~$R_i^j$
449 are edge-disjoint, so there are at most~$n_i$ \<DeleteMin>'s over the course of the phase.
450 Each edge is considered at most twice (once per its endpoint), so the number
451 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)$.
452 \qed
453
454 \lemma\id{ijsize}%
455 Unless the $i$-th phase is final, the forest~$F_i$ consists of at most $2m_i/t_i$ trees.
456
457 \proof
458 As every edge of~$G_i$ is incident with at most two trees of~$F_i$, it is sufficient
459 to establish that there are at least~$t_i$ edges incident with every such tree, including
460 connecting two vertices of the tree.
461
462 The forest~$F_i$ evolves by additions of the trees~$R_i^j$. Let us consider the possibilities
463 how the algorithm could have stopped growing the tree~$R_i^j$:
464 \itemize\ibull
465 \:the heap had more than~$t_i$ elements (step~10): since the each elements stored in the heap
466   corresponds to a~unique edges incident with~$R_i^j$, we have enough such edges;
467 \:the algorithm just added a~vertex of~$F_i$ to~$R_i^j$ (step~9): in this case, an~existing
468   tree of~$F_i$ is extended, so the number of edges incident with it cannot decrease;\foot{%
469   This is the place where we needed to count the interior edges as well.}
470 \:all vertices have been processed (step~8): this can happen only in the final phase.
471 \qeditem
472 \endlist
473
474 \thm\id{itjarthm}%
475 The Iterated Jarn\'\i{}k's algorithm finds the MST of the input graph in time
476 $\O(m\timesbeta(m,n))$, where $\beta(m,n):=\min\{ i: \log^{(i)}n \le m/n \}$.
477
478 \proof
479 Phases are finite and in every phase at least one edge is contracted, so the outer
480 loop is eventually terminated. The resulting subgraph~$T$ is equal to $\mst(G)$, because each $F_i$ is
481 a~subgraph of~$\mst(G_i)$ and the $F_i$'s are glued together according to the Contraction
482 lemma (\ref{contlemma}).
483
484 Let us bound the sizes of the graphs processed in the individual phases. As the vertices
485 of~$G_{i+1}$ correspond to the components of~$F_i$, by the previous lemma $n_{i+1}\le
486 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}$,
487 therefore:
488 $$
489 \left. \vcenter{\hbox{$\displaystyle t_i \ge 2^{2^{\scriptstyle 2^{\scriptstyle\rddots^{\scriptstyle m/n}}}} $}}\;\right\}
490 \,\hbox{a~tower of~$i$ exponentials.}
491 $$
492 As soon as~$t_i\ge n$, the $i$-th phase must be final, because at that time
493 there is enough space in the heap to process the whole graph. So~there are
494 at most~$\beta(m,n)$ phases and we already know that each phase runs in linear
495 time (Lemma~\ref{ijphase}).
496 \qed
497
498 \cor
499 The Iterated Jarn\'\i{}k's algorithm runs in time $\O(m\log^* n)$.
500
501 \proof
502 $\beta(m,n) \le \beta(1,n) = \log^* n$.
503 \qed
504
505 \cor\id{ijdens}%
506 When we use the Iterated Jarn\'\i{}k's algorithm on graphs with edge density
507 at least~$\log^{(k)} n$ for some $k\in{\bb N}^+$, it runs in time~$\O(km)$.
508
509 \proof
510 If $m/n \ge \log^{(k)} n$, then $\beta(m,n)\le k$.
511 \qed
512
513 \obs
514 The algorithm spends most of the time in phases which have small heaps. Once the
515 heap grows to $\Omega(\log^{(k)} n)$ for any fixed~$k$, the graph gets dense enough
516 to guarantee that at most~$k$ phases remain. This means that if we are able to
517 construct a~heap of size $\Omega(\log^{(k)} n)$ with constant time per operation,
518 we can get a~linear-time algorithm for MST. This is the case when the weights are
519 integers:
520
521 \thmn{MST for graphs with integer weights, Fredman and Willard \cite{fw:transdich}}\id{intmst}%
522 MST of a~graph with integer edge weights can be found in time $\O(m)$ on the Word-RAM.
523
524 \proof
525 We will combine the Iterated Jarn\'\i{}k's algorithm with the Q-heaps from section \ref{qheaps}.
526 We modify the first pass of the algorithm to choose $t=\log n$ and use the Q-heap tree instead
527 of the Fibonacci heap. From Theorem \ref{qh} and Remark \ref{qhtreerem} we know that the
528 operations on the Q-heap tree run in constant time, so the modified first phase takes time~$\O(m)$.
529 Following the analysis of the original algorithm in the proof of Theorem \ref{itjarthm} we obtain
530 $t_2\ge 2^{t_1} = 2^{\log n} = n$, so the algorithm stops after the second phase.\foot{%
531 Alternatively, we can use the Q-heaps directly with $k=\log^{1/4}n$ and then stop
532 after the third phase.}
533 \qed
534
535 \rem
536 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))$.
537 They split the adjacency lists of the vertices to small buckets, keep each bucket
538 sorted and consider only the lightest edge in each bucket until it is removed.
539 The mechanics of the algorithm is complex and there is a~lot of technical details
540 which need careful handling, so we omit the description of this algorithm.
541 A~better algorithm will be shown in Chapter \ref{optchap}.
542
543 %--------------------------------------------------------------------------------
544
545 \section{Verification of minimality}
546
547 Now we will turn our attention to a~slightly different problem: given a~spanning
548 tree, how to verify that it is minimum? We will show that this can be achieved
549 in linear time and it will serve as a~basis for a~randomized linear-time
550 MST algorithm in Section~\ref{randmst}.
551
552 MST verification has been studied by Koml\'os \cite{komlos:verify}, who has
553 proven that $\O(m)$ edge comparisons are sufficient, but his algorithm needed
554 superlinear time to find the edges to compare. Dixon, Rauch and Tarjan
555 have later shown in \cite{dixon:verify} that the overhead can be reduced
556 to linear time on the RAM using preprocessing and table lookup on small
557 subtrees. Later, King has given a~simpler algorithm in \cite{king:verifytwo}.
558
559 In this section, we will follow Koml\'os's steps and study the comparisons
560 needed, saving the actual efficient implementation for later.
561
562 \para
563 To verify that a~spanning~$T$ is minimum, it is sufficient to check that all
564 edges outside~$T$ are $T$-heavy (by Theorem \ref{mstthm}). In fact, we will be
565 able to find all $T$-light edges efficiently. For each edge $uv\in E\setminus T$,
566 we will find the heaviest edge of the tree path $T[u,v]$ and compare its weight
567 to $w(uv)$. It is therefore sufficient to solve the following problem:
568
569 \problem
570 Given a~weighted tree~$T$ and a~set of \df{query paths} $Q \subseteq \{ T[u,v] ; u,v\in V(T) \}$
571 specified by their endpoints, find the heaviest edge (\df{peak}) for every path in~$Q$.
572
573 \paran{Bor\o{u}vka trees}%
574 Finding the peaks can be burdensome if the tree~$T$ is degenerated,
575 so we will first reduce it to the same problem on a~balanced tree. We run
576 the Bor\o{u}vka's algorithm on~$T$, which certainly produces $T$ itself, and we
577 record the order in which the subtrees have been merged in another tree~$B(T)$.
578 The peak queries on~$T$ can be then easily translated to peak queries on~$B(T)$.
579
580 \defn
581 For a~weighted tree~$T$ we define its \df{Bor\o{u}vka tree} $B(T)$ as a~rooted tree which records
582 the execution of the Bor\o{u}vka's algorithm run on~$T$. The leaves of $B(T)$
583 are all the vertices of~$T$, an~internal vertex~$v$ at level~$i$ from the bottom
584 corresponds to a~component tree~$C(v)$ formed in the $i$-th phase of the algorithm. When
585 a~tree $C(v)$ selects an adjacent edge~$e$ and gets merged with some other trees to form
586 a~component $C(u)$, we add an~edge $uv$ to~$B(T)$ and set its weight to $w(e)$.
587
588 \figure{bortree.eps}{\epsfxsize}{An octipede and its Bor\o{u}vka tree}
589
590 \obs
591 As the algorithm finishes with a~single component in the last phase, the Bor\o{u}vka tree
592 is really a~tree. All its leaves are on the same level and each internal vertex has
593 at least two sons. Such trees will be called \df{complete branching trees.}
594
595 \lemma
596 For every tree~$T$ and every pair of its vertices $x,y\in V(T)$, the peak
597 of the path $T[x,y]$ has the same weight as the peak of~the path $B(T)[x,y]$.
598
599 \proof
600 Let us denote the path $T[x,y]$ by~$P$ and its heaviest edge by~$h=ab$. Similarly,
601 let us use $P'$ for $B(T)[x,y]$ and $h'$ for the heaviest edge of~$P'$.
602
603 We will first prove that~$h$ has its counterpart of the same weight in~$P'$,
604 so $w(h') \ge w(h)$. Consider the lowest vertex $u$ of~$B(T)$ such that the
605 component $C(u)$ contains both $a$ and~$b$, and consider the sons $v_a$ and $v_b$ of~$u$
606 for which $a\in C(v_a)$ and $b\in C(v_b)$. As the edge~$h$ must have been
607 selected by at least one of these components, we assume without loss of generality that
608 it was $C(v_a)$, and hence we have $w(uv_a)=w(h)$. We will show that the
609 edge~$uv_a$ lies in~$P'$, because exactly one of the endpoints of~$h$ lies
610 in~$C(v_a)$. Both endpoints cannot lie there, since it would imply that $C(v_a)$,
611 being connected, contains the whole path~$P$, including~$h$. On the other hand,
612 if $C(v_a)$ contained neither~$x$ nor~$y$, it would have to be incident with
613 another edge of~$P$ different from~$h$, so this lighter edge would be selected
614 instead of~$h$.
615
616 In the other direction: for any edge~$uv\in P'$, the tree~$C(v)$ is incident
617 with at least one edge of~$P$, so the selected edge must be lighter or equal
618 to this edge and hence also to~$h$.
619 \qed
620
621 \para
622 We will simplify the problem even further: For an~arbitrary tree~$T$, we split each
623 query path $T[x,y]$ to two half-paths $T[x,a]$ and $T[a,y]$ where~$a$ is the
624 \df{lowest common ancestor} of~$x$ and~$y$ in~$T$. It is therefore sufficient to
625 consider only paths that connect a~vertex with one of its ancestors.
626
627 When we combine the two transforms, we get:
628
629 \lemma\id{verbranch}%
630 For each tree~$T$ on $n$~vertices and a~set~$Q$ of $q$~query paths on~$T$, it is possible
631 to find a~complete branching tree~$T'$, together with a~set~$Q'$ of paths on~$T'$,
632 such that the weights of the heaviest edges of the paths in~$Q$ can be deduced from
633 the same of the paths in~$Q'$. The tree $T'$ has at most $2n$ vertices and $\O(\log n)$
634 levels. The set~$Q'$ contains at most~$2q$ paths and each of them connects a~vertex of~$T'$
635 with one of its ancestors. The construction of~$T'$ involves $\O(n)$ comparisons
636 and the transformation of the answers takes $\O(q)$ comparisons.
637
638 \proof
639 The tree~$T'$ will be the Bor\o{u}vka tree for~$T$, obtained by running the
640 contractive version of the Bor\o{u}vka's algorithm (Algorithm \ref{contbor})
641 on~$T$. The algorithm runs in linear time, for example because trees are planar
642 (Theorem \ref{planarbor}). We therefore spend $\O(n)$ comparisons in it.
643
644 As~$T'$ has~$n$ leaves and it is a~complete branching tree, it has at most~$n$ internal vertices,
645 so~$n(T')\le 2n$ as promised. Since the number of passes of the Bor\o{u}vka's
646 algorithm is $\O(\log n)$, the depth of the Bor\o{u}vka tree must be logarithmic as well.
647
648 For each query path $T[x,y]$ we find the lowest common ancestor of~$x$ and~$y$
649 and split the path by the two half-paths. This produces a~set~$Q'$ of at most~$2q$ half-paths.
650 The peak of every original query path is then the heavier of the peaks of its halves.
651 \qed
652
653 \paran{Bounding comparisons}%
654 We will now describe a~simple variant of the depth-first search which finds the
655 peaks of all query paths of the transformed problem. As we promised,
656 we will take care of the number of comparisons only, as long as all other operations
657 are well-defined and they can be performed in polynomial time.
658
659 \defn
660 For every edge~$e=uv$, we consider the set $Q_e$ of all query paths containing~$e$.
661 The vertex of a~path, which is closer to the root, will be called its \df{top,}
662 the other vertex its \df{bottom.}
663 We define arrays $T_e$ and~$P_e$ as follows: $T_e$ contains
664 the tops of the paths in~$Q_e$ in order of their increasing depth (we
665 will call them \df{active tops} and each of them will be stored exactly once). For
666 each active top~$t=T_e[i]$, we define $P_e[i]$ as the peak of the path $T[v,t]$.
667
668 \obs
669 As for every~$i$ the path $T[v,T_e[i+1]]$ is contained within $T[v,T_e[i]]$,
670 the edges of~$P_e$ must have non-increasing weights, that is $w(P_e[i+1]) \le
671 w(P_e[i])$.
672
673 \alg $\<FindPeaks>(u,p,T_p,P_p)$ --- process all queries in the subtree rooted
674 at~$u$ entered from its parent via an~edge~$p$.
675 \id{findpeaks}
676
677 \algo
678 \:Process all query paths whose bottom is~$u$ and record their peaks.
679 This is accomplished by finding the index~$i$ of each path's top in~$T_p$ and reading
680 the desired edge from~$P_p[i]$.
681
682 \:For every son~$v$ of~$u$, process the edge $e=uv$:
683
684 \::Construct the array of tops~$T_e$ for the edge~$e$: Start with~$T_p$, remove
685    the tops of the paths that do not contain~$e$ and add the vertex~$u$ itself
686    if there is a~query path which has~$u$ as its top and which has bottom somewhere
687    in the subtree rooted at~$v$.
688
689 \::Prepare the array of the peaks~$P_e$: Start with~$P_p$, remove the entries
690    corresponding to the tops that are no longer active. If $u$ became an~active
691    top, append~$e$ to the array.
692
693 \::Finish~$P_e$:
694    Since the paths leading to all active tops have been extended by the
695    edge~$e$, compare $w(e)$ with weights of the edges recorded in~$P_e$ and replace
696    those edges which are lighter by~$e$.
697    Since $P_p$ was sorted, we can use binary search
698    to locate the boundary between lighter and heavier edges in~$P_e$.
699
700 \::Recurse on~$v$: call $\<FindPeaks>(v,e,T_e,P_e)$.
701 \endalgo
702
703 \>As we need a~parent edge to start the recursion, we add an~imaginary parent
704 edge~$p_0$ of the root vertex~$r$, for which no queries are defined. We can
705 therefore start with $\<FindPeaks>(r,p_0,\emptyset,\emptyset)$.
706
707 Let us account for the comparisons:
708
709 \lemma\id{vercompares}%
710 When the procedure \<FindPeaks> is called on the transformed problem, it
711 performs $\O(n+q)$ comparisons, where $n$ is the size of the tree and
712 $q$ is the number of query paths.
713
714 \proof
715 We will calculate the number of comparisons~$c_i$ performed when processing the edges
716 going from the $(i+1)$-th to the $i$-th level of the tree.
717 The levels are numbered from the bottom, so leaves are at level~0 and the root
718 is at level $\ell\le \lceil \log_2 n\rceil$. There are $n_i\le n/2^i$ vertices
719 at the $i$-th level, so we consider exactly $n_i$ edges. To avoid taking a~logarithm
720 of zero, we define $\vert T_e\vert=1$ for $T_e=\emptyset$.
721 \def\eqalign#1{\null\,\vcenter{\openup\jot
722   \ialign{\strut\hfil$\displaystyle{##}$&$\displaystyle{{}##}$\hfil
723       \crcr#1\crcr}}\,}
724 $$\vcenter{\openup\jot\halign{\strut\hfil $\displaystyle{#}$&$\displaystyle{{}#}$\hfil&\quad#\hfil\cr
725 c_i &\le \sum_e \left( 1 + \log \vert T_e\vert \right)&(Total cost of the binary searches.)\cr
726     &\le n_i + \sum_e \log\vert T_e\vert&(We sum over $n_i$ edges.)\cr
727     &\le n_i + n_i \cdot {\sum_e \log\vert T_e\vert \over n_i}&(Consider the average of logarithms.) \cr
728     &\le n_i + n_i \cdot \log{\sum_e \vert T_e\vert \over n_i}&(Logarithm is concave.) \cr
729     &\le n_i + n_i \cdot \log{q+n\over n_i}&(Bound the number of tops by queries.) \cr
730     &= n_i \cdot \left( 1 + \log\left({q+n\over n}\cdot{n\over n_i}\right) \right)\cr
731     &= n_i + n_i\log{q+n\over n} + n_i\log{n\over n_i}.\cr
732 }}$$
733 Summing over all levels, we estimate the total number of comparisons as:
734 $$
735 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).
736 $$
737 The first part is equal to~$n$, the second one to $n\log((q+n)/n)\le q+n$. For the third
738 one, we would like to plug in the bound $n_i \le n/2^i$, but we unfortunately have one~$n_i$
739 in the denominator. We save the situation by observing that the function $f(x)=x\log(n/x)$
740 is decreasing\foot{We can easily check the derivative: $f(x)=(x\ln n-x\ln x)/\ln 2$, so $f'(x)\cdot \ln2 =
741 \ln n - \ln x - 1$. We want $f'(x)<0$ and therefore $\ln x > \ln n - 1$, i.e., $x > n/e$.}
742 for $x > n/e$, so for $i\ge 2$ it holds that:
743 $$
744 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.
745 $$
746 We can therefore rewrite the third part as:
747 $$\eqalign{
748 \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
749 &\le n\log1 + n_1\cdot {n\over n_1} + n\cdot\O(1) = \O(n).\cr
750 }$$
751 Putting all three parts together, we conclude that:
752 $$
753 c \le n + (q+n) + \O(n) = \O(n+q). \qedmath
754 $$
755
756 \para
757 When we combine this lemma with the above reduction, we get the following theorem:
758
759 \thmn{Verification of the MST, Koml\'os \cite{komlos:verify}}\id{verify}%
760 For every weighted graph~$G$ and its spanning tree~$T$, it is sufficient to
761 perform $\O(m)$ comparisons of edge weights to determine whether~$T$ is minimum
762 and to find all $T$-light edges in~$G$.
763
764 \proof
765 We first transform the problem to finding all peaks of a~set
766 of query paths in~$T$ (these are exactly the paths covered by the edges
767 of $G\setminus T$). We use the reduction from Lemma \ref{verbranch} to get
768 an~equivalent problem with a~full branching tree and a~set of parent-descendant
769 paths. The reduction costs $\O(m+n)$ comparisons.
770 Then we run the \<FindPeaks> procedure (Algorithm \ref{findpeaks}) to find
771 the tops of all query paths. According to Lemma \ref{vercompares}, this spends another $\O(m+n)$
772 comparisons. Since we (as always) assume that~$G$ is connected, $\O(m+n)=\O(m)$.
773 \qed
774
775 \rem
776 The problem of computing path maxima or minima in a~weighted tree has several other interesting
777 applications. One of them is computing minimum cuts separating given pairs of vertices in a~given
778 weighted undirected graph~$G$. We construct a~Gomory-Hu tree~$T$ for the graph as described in \cite{gomoryhu}
779 (see also \cite{bhalgat:ght} for a~more efficient algorithm running in time
780 $\widetilde\O(mn)$ for unit-cost graphs). The crucial property of this tree is that for every two
781 vertices $u$, $v$ of the graph~$G$, the minimum-cost edge on $T[u,v]$ has the same cost
782 as the minimum cut separating $u$ and~$v$ in~$G$. Since the construction of~$T$ generally
783 takes $\Omega(n^2)$ time, we could of course invest this time in precomputing the minima for
784 all pairs of vertices. This would however require quadratic space, so we can better use
785 the method of this section which fits in $\O(n+q)$ space for $q$~queries.
786
787 \rem
788 A~dynamic version of the problem is also often considered. It calls for a~data structure
789 representing a~weighted forest with operations for modifying the structure of the forest
790 and querying minima or maxima on paths. Sleator and Tarjan have shown in \cite{sleator:trees}
791 how to do this in $\O(\log n)$ time amortized per operation, which leads to
792 an~implementation of the Dinic's maximum flow algorithm \cite{dinic:flow}
793 in time $\O(mn\log n)$.
794
795 %--------------------------------------------------------------------------------
796
797 \section{Verification in linear time}\id{verifysect}%
798
799 We have proven that $\O(m)$ edge weight comparisons suffice to verify minimality
800 of a~given spanning tree. Now we will show an~algorithm for the RAM,
801 which finds the required comparisons in linear time. We will follow the idea
802 of King from \cite{king:verifytwo}, but as we have the power of the RAM data structures
803 from Section~\ref{bitsect} at our command, the low-level details will be easier,
804 especially the construction of vertex and edge labels.
805
806 \para
807 First of all, let us make sure that the reduction to fully branching trees
808 in Lemma \ref{verbranch} can be made run in linear time. As already noticed
809 in the proof, the Bor\o{u}vka's algorithm runs in linear time. Constructing
810 the Bor\o{u}vka tree in the process adds at most a~constant overhead to every
811 step of the algorithm.
812
813 Finding the common ancestors is not trivial, but Harel and Tarjan have shown
814 in \cite{harel:nca} that linear time is sufficient on the RAM. Several more
815 accessible algorithms have been developed since then (see the Alstrup's survey
816 paper \cite{alstrup:nca} and a~particularly elegant algorithm described by Bender
817 and Falach-Colton in \cite{bender:lca}). Any of them implies the following
818 theorem:
819
820 \thmn{Lowest common ancestors}\id{lcathm}%
821 On the RAM, it is possible to preprocess a~tree~$T$ in time $\O(n)$ and then
822 answer lowest common ancestor queries presented online in constant time.
823
824 \cor
825 The reductions in Lemma \ref{verbranch} can be performed in time $\O(m)$.
826
827 \para
828 Having the reduced problem at hand, it remains to implement the procedure \<FindPeaks>
829 of Algorithm \ref{findpeaks} efficiently. We need a~compact representation of
830 the arrays $T_e$ and~$P_e$, which will allow to reduce the overhead of the algorithm
831 to time linear will be linear in the number of comparisons performed. To achieve
832 this goal, we will encode the arrays in RAM vectors (see Section \ref{bitsect}
833 for the vector operations).
834
835 \defn
836
837 \em{Vertex identifiers:} Since all vertices processed by the procedure
838 lie on the path from the root to the current vertex~$u$, we modify the algorithm
839 to keep a~stack of these vertices in an~array. We will often refer to each vertex by its
840 index in this array, i.e., by its depth. We will call these identifiers \df{vertex
841 labels} and we note that each label requires only $\ell=\lceil \log\lceil\log n\rceil\rceil$
842 bits. As every tree edge is uniquely identified by its bottom vertex, we can
843 use the same encoding for \df{edge labels.}
844
845 \em{Slots:} As we will need several operations which are not computable
846 in constant time on the RAM, we precompute tables for these operations
847 like we did in the Q-heaps (cf.~Lemma \ref{qhprecomp}). A~table for word-sized
848 arguments would take too much time to precompute, so we will generally store
849 our data structures in \df{slots} of $s=\lceil 1/3\cdot\log n\rceil$ bits each.
850 We will show soon that it is possible to precompute a~table of any reasonable
851 function whose arguments fit in two slots.
852
853 \em{Top masks:} The array~$T_e$ will be represented by a~bit mask~$M_e$ called the \df{top mask.} For each
854 of the possible tops~$t$ (i.e., the ancestors of the current vertex), we store
855 a~single bit telling whether $t\in T_e$. Each top mask fits in $\lceil\log n\rceil$
856 bits and therefore in a~single machine word. If needed, it can be split to three slots.
857 Unions and intersections of sets of tops then translate to calling $\band$/$\bor$
858 on the top masks.
859
860 \em{Small and big lists:} The heaviest edge found so far for each top is stored
861 by the algorithm in the array~$P_e$. Instead of keeping the real array,
862 we store the labels of these edges in a~list encoded in a~bit string.
863 Depending on the size of the list, we use one of two possible encodings:
864 \df{Small lists} are stored in a~vector which fits in a~single slot, with
865 the unused fields filled by a~special constant, so that we can easily infer the
866 length of the list.
867
868 If the data do not fit in a~small list, we use a~\df{big list} instead, which
869 is stored in $\O(\log\log n)$ words, each of them containing a~slot-sized
870 vector. Unlike the small lists, we use the big lists as arrays. If a~top~$t$ of
871 depth~$d$ is active, we keep the corresponding entry of~$P_e$ in the $d$-th
872 field of the big list. Otherwise, we keep that entry unused.
873
874 We want to perform all operations on small lists in constant time,
875 but we can afford spending time $\O(\log\log n)$ on every big list. This
876 is true because whenever we use a~big list, $\vert T_e\vert = \Omega(\log n/\log\log n)$,
877 hence we need $\log\vert T_e\vert = \Omega(\log\log n)$ comparisons anyway.
878
879 \em{Pointers:} When we need to construct a~small list containing a~sub-list
880 of a~big list, we do not have enough time to see the whole big list. To handle
881 this, we introduce \df{pointers} as another kind of edge identifiers.
882 A~pointer is an~index to the nearest big list on the path from the small
883 list containing the pointer to the root. As each big list has at most $\lceil\log n\rceil$
884 fields, the pointer fits in~$\ell$ bits, but we need one extra bit to distinguish
885 between normal labels and pointers.
886
887 \lemman{Precomputation of tables}
888 When~$f$ is a~function of two arguments computable in polynomial time, we can
889 precompute a~table of the values of~$f$ for all values of arguments that fit
890 in a~single slot. The precomputation takes $\O(n)$ time.
891
892 \proof
893 Similar to the proof of Lemma \ref{qhprecomp}. There are $\O(2^{2s}) = \O(n^{2/3})$
894 possible values of arguments, so the precomputation takes time $\O(n^{2/3}\cdot\poly(s))
895 = \O(n^{2/3}\cdot\poly(\log n)) = \O(n)$.
896 \qed
897
898 \example
899 As we can afford spending spending $\O(n)$ time on preprocessing,
900 we can assume that we can compute the following functions in constant time:
901
902 \itemize\ibull
903 \:$\<Weight>(x)$ --- the Hamming weight of a~slot-sized number~$x$
904 (we already considered this operation in Algorithm \ref{lsbmsb}, but we needed
905 quadratic word size for it). We can easily extend this to $\log n$-bit numbers
906 by splitting the number in three slots and adding their weights.
907
908 \:$\<FindKth>(x,k)$ --- the $k$-th set bit from the top of the slot-sized
909 number~$x$. Again, this can be extended to multi-slot numbers by calculating
910 the \<Weight> of each slot first and then finding the slot containing the
911 $k$-th~\1.
912
913 \:$\<Bits>(m)$ --- for a~slot-sized bit mask~$m$, it returns a~small list
914 of the positions of the bits set in~$\(m)$.
915
916 \:$\<Select>(x,m)$ --- constructs a~slot containing the substring of $\(x)$
917 selected by the bits set in~$\(m)$.
918
919 \:$\<SubList>(x,m)$ --- when~$x$ is a~small list and~$m$ a bit mask, it returns
920 a~small list containing the elements of~$x$ selected by the bits set in~$m$.
921 \endlist
922
923 \para
924 We will now show how to perform all parts of the procedure \<FindPeaks>
925 in the required time. We will denote the size of the tree by~$n$ and the
926 number of query paths by~$q$.
927
928 \lemma
929 Depths of all vertices and all top masks can be computed in time $\O(n+q)$.
930
931 \proof
932 Run depth-first search on the tree, assign the depth of a~vertex when entering
933 it and construct its top mask when leaving it. The top mask can be obtained
934 by $\bor$-ing the masks of its sons, excluding the level of the sons and
935 including the tops of all query paths that have their bottoms at the current vertex
936 (the depths of the tops are already assigned).
937 \qed
938
939 \lemma\id{verth}%
940 The arrays $T_e$ and~$P_e$ can be indexed in constant time.
941
942 \proof
943 Indexing~$T_e$ is exactly the operation \<FindKth> applied on the corresponding
944 top mask~$M_e$.
945
946 If $P_e$ is stored in a~big list, we calculate the index of the particular
947 slot and the position of the field inside the slot. This field can be then
948 extracted using bit masking and shifts.
949
950 If it is a~small list, we extract the field directly, but we have to
951 dereference it in case it is a pointer. We modify the recursion in \<FindPeaks>
952 to pass the depth of the lowest edge endowed with a~big list and when we
953 encounter a~pointer, we index this big list.
954 \qed
955
956 \lemma\id{verhe}%
957 For an~arbitrary active top~$t$, the corresponding entry of~$P_e$ can be
958 extracted in constant time.
959
960 \proof
961 We look up the precomputed depth~$d$ of~$t$ first.
962 If $P_e$ is stored in a~big list, we extract the $d$-th entry of the list.
963 If the list is small, we find the position of the particular field
964 by counting bits of the top mask~$M_e$ at position~$d$ and higher
965 (this is \<Weight> of $M_e$ with the lower bits masked out).
966 \qed
967
968 \lemma\id{verfh}%
969 The procedure \<FindPeaks> processes an~edge~$e$ in time $\O(\log \vert T_e\vert + q_e)$,
970 where $q_e$~is the number of query paths having~$e$ as its bottom edge.
971
972 \proof
973 The edge is examined in steps 1, 3, 4 and~5 of the algorithm. We will show how to
974 perform each of these steps in constant time if $P_e$ is a~small list or
975 $\O(\log\log n)$ if it is big.
976
977 \em{Step~1} looks up $q_e$~tops in~$P_e$ and we already know from Lemma \ref{verhe}
978 how to do that in constant time per top.
979
980 \em{Step~3} is trivial as we have already computed the top masks and we can
981 reconstruct the entries of~$T_e$ in constant time according to Lemma \ref{verth}.
982
983 \em{Step~5} involves binary search on~$P_e$ in $\O(\log\vert T_e\vert)$ comparisons,
984 each of them indexes~$P_e$, which is $\O(1)$ again by Lemma \ref{verth}. Rewriting the
985 lighter edges is $\O(1)$ for small lists by replication and bit masking, for a~big
986 list we do the same for each of its slots.
987
988 \em{Step~4} is the only non-trivial one. We already know which tops to select
989 (we have the top masks $M_e$ and~$M_p$ precomputed), but we have to carefully
990 extract the sublist.
991 We need to handle these four cases:
992
993 \itemize\ibull
994 \:\em{Small from small:} We use $\<Select>(T_e,T_p)$ to find the fields of~$P_p$
995 that shall be deleted by a~subsequent call to \<SubList>. Pointers
996 can be retained as they still refer to the same ancestor list.
997
998 \:\em{Big from big:} We can copy the whole~$P_p$, since the layout of the
999 big lists is fixed and the items we do not want simply end up as unused
1000 fields in~$P_e$.
1001
1002 \:\em{Small from big:} We use the operation \<Bits> to construct a~list
1003 of pointers (we use bit masking to add the ``this is a~pointer'' flags).
1004
1005 \:\em{Big from small:} First we have to dereference the pointers in the
1006 small list~$S$. For each slot~$B_i$ of the ancestor big list, we construct
1007 a~subvector of~$S$ containing only the pointers referring to that slot,
1008 adjusted to be relative to the beginning of the slot (we use \<Compare>
1009 and \<Replicate> from Algorithm \ref{vecops} and bit masking). Then we
1010 use a~precomputed table to replace the pointers by the fields of~$B_i$
1011 they point to. We $\bor$ together the partial results and we again have
1012 a~small list.
1013
1014 Finally, we have to spread the fields of this small list to the whole big list.
1015 This is similar: for each slot of the big list, we find the part of the small
1016 list keeping the fields we want (we call \<Weight> on the sub-words of~$M_e$ before
1017 and after the intended interval of depths) and we use a~tabulated function
1018 to shift the fields to the right locations in the slot (controlled by the
1019 sub-word of~$M_e$ in the intended interval).
1020 \qeditem
1021 \endlist
1022
1023 \>We are now ready to combine these steps and get the following theorem:
1024
1025 \thmn{Verification of MST on the RAM}\id{ramverify}%
1026 There is a~RAM algorithm, which for every weighted graph~$G$ and its spanning tree~$T$
1027 determines whether~$T$ is minimum and finds all $T$-light edges in~$G$ in time $\O(m)$.
1028
1029 \proof
1030 Implement the Koml\'os's algorithm from Theorem \ref{verify} with the data
1031 structures developed in this section.
1032 According to Lemma \ref{verfh}, it runs in time $\sum_e \O(\log\vert T_e\vert + q_e)
1033 = \O(\sum_e \log\vert T_e\vert) + \O(\sum_e q_e)$. The second sum is $\O(m)$
1034 as there are $\O(1)$ query paths per edge, the first sum is $\O(\#\hbox{comparisons})$,
1035 which is $\O(m)$ by Theorem \ref{verify}.
1036 \qed
1037
1038 \rem\id{pmverify}%
1039 Buchsbaum et al.~\cite{buchsbaum:verify} have recently shown that linear-time
1040 verification can be achieved even on the Pointer machine. They first solve the
1041 problem of finding the lowest common ancestors for a~set of pairs of vertices
1042 by batch processing: They combine an~algorithm of time complexity $\O(m\timesalpha(m,n))$
1043 based on the Disjoint Set Union data structure with the framework of topological graph
1044 computations developed in Section \ref{bucketsort}. Then they use a~similar
1045 technique for finding the peaks themselves.
1046
1047 \rem
1048 The online version of this problem has turned out to be more difficult. It calls for an~algorithm
1049 that preprocesses the tree and then answers queries for peaks of paths presented online. Pettie
1050 \cite{pettie:onlineverify} has proven an~interesting lower bound based on the inverses of the
1051 Ackermann's function (see \ref{ackerinv}). If we want to answer queries within $t$~comparisons, we
1052 have to invest $\Omega(n\log\lambda_t(n))$ time into preprocessing. This implies that with
1053 preprocessing in linear time, the queries require $\Omega(\alpha(n))$ time.
1054
1055 %--------------------------------------------------------------------------------
1056
1057 \section{A~randomized algorithm}\id{randmst}%
1058
1059 When we analysed the contractive Bor\o{u}vka's algorithm in Section~\ref{contalg},
1060 we observed that while the number of vertices per iteration decreases exponentially,
1061 the number of edges generally does not, so we spend $\Theta(m)$ time on every phase.
1062 Karger, Klein and Tarjan \cite{karger:randomized} have overcome this problem by
1063 combining the Bor\o{u}vka's algorithm with filtering based on random sampling.
1064 This leads to a~randomized algorithm which runs in linear expected time.
1065
1066 The principle of the filtering is simple: Let us consider any spanning tree~$T$
1067 of the input graph~$G$. Each edge of~$G$ that is $T$-heavy is the heaviest edge
1068 of some cycle, so by the Red lemma (\ref{redlemma}) it cannot participate in
1069 the MST of~$G$. We can therefore discard all $T$-heavy edges and continue with
1070 finding the MST on the reduced graph. Of course, not all choices of~$T$ are equally
1071 good, but it will soon turn out that when we take~$T$ as the MST of a~randomly selected
1072 subgraph, only a~small expected number of edges remains.
1073
1074 Selecting a~subgraph at random will unavoidably produce disconnected subgraphs
1075 at occassion, so we will drop the implicit assumption that all graphs are
1076 connected for this section and we will always search for the minimum spanning forest.
1077 As we already noted (Remark \ref{disconn}), with a~little bit of care our
1078 algorithms and theorems keep working.
1079
1080 Since we need the MST verification algorithm for finding the $T$-heavy edges,
1081 we will assume that we are working on the RAM.
1082
1083 \lemman{Random sampling, Karger \cite{karger:sampling}}
1084 Let $H$~be a~subgraph of~$G$ obtained by including each edge independently
1085 with probability~$p$ and $F$~the minimum spanning forest of~$H$. Then the
1086 expected number of $F$-nonheavy edges in~$G$ is at most $n/p$.
1087
1088 \proof
1089 Let us observe that we can obtain the forest~$F$ by running the Kruskal's algorithm
1090 (\ref{kruskal}) combined with the random process producing~$H$ from~$G$. We sort all edges of~$G$
1091 by their weights and we start with an~empty forest~$F$. For each edge, we first
1092 flip a~biased coin (which gives heads with probability~$p$) and if it comes up
1093 tails, we discard the edge. Otherwise we perform a~single step of the Kruskal's
1094 algoritm: We check whether $F+e$ contains a~cycle. If it does, we discard~$e$, otherwise
1095 we add~$e$ to~$F$. At the end, we have produced the subgraph~$H$ and its MSF~$F$.
1096
1097 When we  exchange the check for cycles with flipping the coin, we get an~equivalent
1098 algorithm which will turn out to be more convenient to analyse:
1099 \algo
1100 \:If $F+e$ contains a~cycle, we immediately discard~$e$ (we can flip
1101 the coin, but we need not to, because the edge will be discarded regardless of
1102 the outcome). We note that~$e$ is $F$-heavy with respect to both the
1103 current state of~$F$ and the final MSF.
1104 \:If $F+e$ is acyclic, we flip the coin:
1105 \::If it comes up heads, we add~$e$ to~$F$. In this case, $e$~is neither $F$-light
1106    nor $F$-heavy.
1107 \::If it comes up tails, we discard~$e$. Such edges are $F$-light.
1108 \endalgo
1109
1110 The number of $F$-nonheavy edges is therefore equal to the total number of the coin
1111 flips in step~2 of this algorithm. We also know that the algorithm stops before
1112 it adds $n$~edges to~$F$. Therefore it flips at most as many coins as a~simple
1113 random process which repeatedly flips until it gets~$n$ heads. As waiting for
1114 every occurence of heads takes expected time~$1/p$, waiting for~$n$ heads
1115 must take $n/p$. This is the bound we wanted to achieve.
1116 \qed
1117
1118 \para
1119 We will formulate the algorithm as a~doubly-recursive procedure. It alternatively
1120 peforms steps of the Bor\o{u}vka's algorithm and filtering based on the above lemma.
1121 The first recursive call computes the MSF of the sampled subgraph, the second one
1122 finds the MSF of the graph without the heavy edges.
1123
1124 As in all contractive algorithms, we use edge labels to keep track of the
1125 original locations of the edges in the input graph. For the sake of simplicity,
1126 we do not mention it in the algorithm.
1127
1128 \algn{MSF by random sampling --- the KKT algorithm}\id{kkt}%
1129 \algo
1130 \algin A~graph $G$ with an~edge comparison oracle.
1131 \:Remove isolated vertices from~$G$. If no vertices remain, stop and return an~empty forest.
1132 \:Perform two Bor\o{u}vka steps (iterations of Algorithm \ref{contbor}) on~$G$ and
1133   remember the set~$B$ of edges contracted.
1134 \:Select subgraph~$H\subseteq G$ by including each edge independently with
1135   probability $1/2$.
1136 \:$F\=\msf(H)$ calculated recursively.
1137 \:Construct $G'\subseteq G$ by removing all $F$-heavy edges of~$G$.
1138 \:$R\=\msf(G')$ calculated recursively.
1139 \:Return $R\cup B$.
1140 \algout The minimum spanning forest of~$G$.
1141 \endalgo
1142
1143 \nota
1144 Let us analyse the time complexity of this algorithm by studying properties of its \df{recursion tree.}
1145 The tree describes the subproblems processed by the recursive calls. For any vertex~$v$
1146 of the tree, we denote the number of vertices and edges of the corresponding subproblem~$G_v$
1147 by~$n_v$ and~$m_v$ respectively.
1148 If $m_v>0$, the recursion continues: the left son of~$v$ corresponds to the
1149 call on the sampled subgraph~$H_v$, the right son to the reduced graph~$G^\prime_v$.
1150 (Similarly, we use letters subscripted with~$v$ for the state of the other variables
1151 of the algorithm.)
1152 The root of the recursion tree is obviously the original graph~$G$, the leaves are
1153 trivial graphs with no edges.
1154
1155 \obs
1156 The Bor\o{u}vka steps together with the removal of isolated vertices guarantee that the number
1157 of vertices drops at least by a~factor of four in every recursive call. The size of a~subproblem~$G_v$
1158 at level~$i$ is therefore at most $n/4^i$ and the depth of the tree is at most $\lceil\log_4 n\rceil$.
1159 As there are no more than~$2^i$ subproblems at level~$i$, the sum of all~$n_v$'s
1160 on that level is at most $n/2^i$, which is at most~$2n$ for the whole tree.
1161
1162 We are going to show that the worst case of the KKT algorithm is not worse than
1163 of the plain contractive algorithm, while the average case is linear.
1164
1165 \lemma
1166 For every subproblem~$G_v$, the KKT algorithm spends time $\O(m_v+n_v)$ plus the time
1167 spent on the recursive calls.
1168
1169 \proof
1170 We know from Lemma \ref{contiter} that each Bor\o{u}vka step takes time $\O(m_v+n_v)$.\foot{We
1171 add $n_v$ as the graph could be disconnected.}
1172 The selection of the edges of~$H_v$ is straightforward.
1173 Finding the $F_v$-heavy edges is not, but we have already shown in Theorem \ref{ramverify}
1174 that linear time is sufficient on the RAM.
1175 \qed
1176
1177 \thmn{Worst-case complexity of the KKT algorithm}
1178 The KKT algorithm runs in time $\O(\min(n^2,m\log n))$ in the worst case on the RAM.
1179
1180 \proof
1181 The argument for the $\O(n^2)$ bound is similar to the analysis of the plain
1182 contractive algorithm. As every subproblem~$G_v$ is a~simple graph, the number
1183 of its edges~$m_v$ is less than~$n_v^2$. By the previous lemma, we spend time
1184 $\O(n_v^2)$ on it. Summing over all subproblems yields $\sum_v \O(n_v^2) =
1185 \O((\sum_v n_v)^2) = \O(n^2)$.
1186
1187 In order to prove the $\O(m\log n)$ bound, it is sufficient to show that the total time
1188 spent on every level of the recursion tree is $\O(m)$. Suppose that $v$~is a~vertex
1189 of the recursion tree with its left son~$\ell$ and right son~$r$. Some edges of~$G_v$
1190 are removed in the Bor\o{u}vka steps, let us denote their number by~$b_v$.
1191 The remaining edges fall either to~$G_\ell = H_v$, or to $G_r = G^\prime_v$, or possibly
1192 to both.
1193
1194 We can observe that the intersection $G_\ell\cap G_r$ cannot be large: The edges of~$H_v$ that
1195 are not in the forest~$F_v$ are $F_v$-heavy, so they do not end up in~$G_r$. Therefore the
1196 intersection can contain only the edges of~$F_v$. As there are at most $n_v/4$ such edges,
1197 we have $m_\ell + m_r + b_v \le m_v + n_v/4$.
1198
1199 On the other hand, the first Bor\o{u}vka step selects at least $n_v/2$ edges,
1200 so $b_v \ge n_v/2$. The duplication of edges between $G_\ell$ and~$G_r$ is therefore
1201 compensated by the loss of edges by contraction and $m_\ell + m_r \le m_v$. So the total
1202 number of edges per level does not decrease and it remains to apply the previous lemma.
1203 \qed
1204
1205 \thmn{Average-case complexity of the KKT algorithm}
1206 The expected time complexity of the KKT algorithm on the RAM is $\O(m)$.
1207
1208 \proof
1209 The structure of the recursion tree depends on the random choices taken,
1210 but as its worst-case depth is at most~$\lceil \log_4 n\rceil$, the tree
1211 is always a~subtree of the complete binary tree of that depth. We will
1212 therefore prove the theorem by examining the complete tree, possibly with
1213 empty subproblems at some vertices.
1214
1215 The set of all left edges in the tree (edges connecting a~parent with its left
1216 son) form a~set of \df{left paths.} Let us consider the expected time spent on
1217 a~single left path. When walking the path downwards from its top vertex~$r$,
1218 the expected size of the subproblems decreases exponentially: for a~son~$\ell$
1219 of a~vertex~$v$, we have $n_\ell \le n_v/4$ and $\E m_\ell = \E m_v/2$. The
1220 expected total time spend on the path is therefore $\O(n_r+m_r)$ and it remains
1221 to sum this over all left paths.
1222
1223 With the exception of the path going from the root of the tree,
1224 the top~$r$ of a~left path is always a~right son of a~unique parent vertex~$v$.
1225 Since the subproblem~$G_r$ has been obtained from its parent subproblem~$G_v$
1226 by filtering out all heavy edges, we can use the Sampling lemma to show that
1227 $\E m_r \le 2n_v$. The sum of the expected sizes of all top subproblems is
1228 then $\sum_r n_r + m_r \le \sum_v 3n_v = \O(n)$. After adding the exceptional path
1229 from the root, we get $\O(m+n)=\O(m)$.
1230 \qed
1231
1232 \rem
1233 There is also a~high-probability version of the above theorem. According to
1234 Karger, Klein and Tarjan \cite{karger:randomized}, the time complexity
1235 of the algorithm is $\O(m)$ with probability $1-\exp(-\Omega(m))$. The proof
1236 again follows the recursion tree and it involves applying the Chernoff bound
1237 \cite{chernoff} to bound the tail probabilities.
1238
1239 \rem
1240 We could also use a~slightly different formulation of the sampling lemma
1241 suggested by Chan \cite{chan:backward}. It changes the selection of the subgraph~$H$
1242 to choosing an~$mp$-edge subset of~$E(G)$ uniformly at random. The proof is then
1243 a~straightforward application of the backward analysis method. We however prefered
1244 the Karger's original version, because generating a~random subset of a~given size
1245 requires an~unbounded number of random bits in the worst case.
1246
1247 \rem
1248 The only place where we needed the power of the RAM is finding the heavy edges,
1249 so we can employ the pointer-machine verification algorithm mentioned in Remark \ref{pmverify}
1250 to bring the results of this section to the~PM.
1251
1252 %--------------------------------------------------------------------------------
1253
1254 \section{Special cases and related problems}
1255
1256 Finally, we will focus our attention on various special cases of the minimum
1257 spanning tree problem which frequently arise in practice.
1258
1259 \examplen{Graphs with sorted edges}
1260 When the edges are already sorted by their weights, we can use the Kruskal's
1261 algorithm to find the MST in time $\O(m\timesalpha(n))$ (Theorem \ref{kruskal}).
1262 We however can do better: As the minimality of a~spanning tree depends only on the
1263 order of weights and not on the actual values (Theorem \ref{mstthm}), we can
1264 renumber the weights to $1, \ldots, m$ and find the MST using the Fredman-Willard
1265 algorithm for integer weights. According to Theorem \ref{intmst} it runs in
1266 time $\O(m)$ on the Word-RAM.
1267
1268 \examplen{Graphs with a~small number of distinct weights}
1269 When the weights of edges are drawn from a~set of a~fixed size~$U$, we can
1270 sort them in linear time and so reduce the problem to the previous case.
1271 A~more practical way is to use the Jarn\'\i{}k's algorithm (\ref{jarnimpl}),
1272 but replace the heap by an~array of $U$~buckets. As the number of buckets
1273 is constant, we can find the minimum in constant time and hence the whole
1274 algorithm runs in time $\O(m)$, even on the Pointer Machine. For large
1275 values of~$U,$ we can build a~binary search tree or the van Emde-Boas
1276 tree (see Section \ref{ramdssect} and \cite{boas:vebt}) on the top of the buckets to bring the complexity
1277 of finding the minimum down to $\O(\log U)$ or $\O(\log\log U)$ respectively.
1278
1279 \examplen{Graphs with floating-point weights}
1280 A~common case of non-integer weights are rational numbers in floating-point (FP)
1281 representation. Even in this case we will be able to find the MST in linear time.
1282 The most common representation of binary FP numbers specified by the IEEE
1283 standard 754-1985 \cite{ieee:binfp} has a~useful property:  When the
1284 bit strings encoding non-negative FP numbers are read as ordinary integers,
1285 the order of these integers is the same as of the original FP numbers. We can
1286 therefore once again replace the edge weights by integers and use the linear-time
1287 integer algorithm. While the other FP representations (see \cite{dgoldberg:fp} for
1288 an~overview) need not have this property, the corresponding integers can be adjusted
1289 in $\O(1)$ time to the format we need. (More advanced tricks of this type have been
1290 employed by Thorup in \cite{thorup:floatint} to extend his linear-time algorithm
1291 for single-source shortest paths to FP edge lengths.)
1292
1293 \examplen{Graphs with bounded degrees}
1294 For graphs with vertex degrees bounded by a~constant~$\Delta$, the problem is either
1295 trivial (if $\Delta<3$) or as hard as for arbitrary graphs. There is a~simple linear-time
1296 transform of arbitrary graphs to graphs with maximum degree~3 which preserves the MST:
1297
1298 \lemman{Degree reduction}\id{degred}%
1299 For every graph~$G$ there exists a~graph~$G'$ with maximum degree at most~3 and
1300 a~function $\pi: E(G)\rightarrow E(G')$ such that $\mst(G) = \pi^{-1}(\mst(G'))$.
1301 The graph $G'$ and the embedding~$\pi$ can be constructed in time $\O(m)$.
1302
1303 \figure{french.eps}{\epsfxsize}{Degree reduction in Lemma~\ref{degred}}
1304
1305 \proof
1306 We show how to eliminate a~single vertex~$v$ of degree $d>3$ and then apply
1307 induction.
1308
1309 Assume that $v$~has neighbors $w_1,\ldots,w_d$. We replace~$v$ and the edges~$vw_i$
1310 by $d$~new vertices $v_1,\ldots,v_d$, joined by a~path $v_1v_2\ldots v_d$, and
1311 edges~$v_iw_i$. Each edge of the path will receive a~weight smaller than all
1312 original weights, the other edges will inherit the weights of the edges $vw_i$
1313 they replace. The edges of the path will therefore lie in the MST (this is
1314 obvious from the Kruskal's algorithm) and as~$G$ can be obtained from the
1315 new~$G'$ by contracting the path, the rest follows from the Contraction lemma
1316 (\ref{contlemma}).
1317
1318 This step can be carried out in time $\O(d)$. As it replaces a high-degree
1319 vertex by vertices of degree~3, the whole procedure stops in at most~$n$ such
1320 steps, so it takes time $\O(\sum_{v\in V}\deg(v)) = \O(m)$ including the
1321 time needed to find the high-degree vertices at the beginning.
1322 \qed
1323
1324 \examplen{Euclidean MST}
1325 The MST also has its counterparts in the realm of geometric algorithms. Suppose
1326 that we have $n$~points $x_1,\ldots,x_n$ in the plane and we want to find the
1327 shortest system of segments connecting these points. If we want the segments to
1328 touch only in the given points, this is equivalent to finding the MST of the
1329 complete graph on the vertices $V=\{x_1,\ldots,x_n\}$ with edge weights
1330 defined as the Euclidean distances of the points. Since the graph is dense, many of the MST
1331 algorithms discussed run in linear time with the size of the graph, hence
1332 in time $\O(n^2)$.
1333
1334 There is a~more efficient method based on the observation that the MST
1335 is always a~subgraph of the Delaunay's tesselation for the given points
1336 (this was first noted by Shamos and Hoey in~\cite{shamos:closest}). The
1337 tesselation is a~planar graph, which guarantees that it has $\O(n)$ edges,
1338 and it is a~dual graph of the Voronoi diagram of the given points, which can
1339 be constructed in time $\O(n\log n)$ using for example the Fortune's
1340 algorithm \cite{fortune:voronoi}. We can therefore reduce the problem
1341 to finding the MST of the tesselation for which $\O(n\log n)$ time
1342 is more than sufficient.
1343
1344 This approach fails for non-Euclidean metrics, but in some cases
1345 (in particular for the rectilinear metric) the $\O(n\log n)$ time bound
1346 is also achievable by the algorithm of Zhou et al.~\cite{zhou:nodel}
1347 based on the sweep-line technique and the Red rule. For other
1348 variations on the geometric MST, see Eppstein's survey paper
1349 \cite{eppstein:spanning}.
1350
1351 \examplen{Steiner trees}
1352 The constraint that the segments in the previous example are allowed to touch
1353 each other only in the given points looks artificial and it is indeed uncommon in
1354 practical applications (including the problem of designing electrical transmission
1355 lines originally studied by Bor\o{u}vka). If we lift this restriction, we get
1356 the problem known by the name Steiner tree.\foot{It is named after the Swiss mathematician
1357 Jacob Steiner who studied a~special case of this problem in the 19th century.}
1358 We can also define it in terms of graphs:
1359
1360 \defn A~\df{Steiner tree} of a~weighted graph~$(G,w)$ with a~set~$M\subseteq V$
1361 of \df{mandatory notes} is a~tree~$T\subseteq G$ that contains all the mandatory
1362 vertices and its weight is minimum possible.
1363
1364 For $M=V$ the Steiner tree is identical to the MST, but if we allow an~arbitrary
1365 choice of the mandatory vertices, it is NP-hard. This has been proven by Garey and Johnson
1366 \cite{garey:steiner,garey:rectisteiner} for not only the graph version with
1367 weights $\{1,2\}$, but also for the planar version with Euclidean or rectilinear
1368 metric. There is a~polynomial approximation algorithm with ratio $5/3$ for
1369 graphs due to Pr\"omel and Steger \cite{proemel:steiner} and a~polynomial-time
1370 approximation scheme for the Euclidean Steiner tree in an~arbitrary dimension
1371 by Arora \cite{arora:tspapx}.
1372
1373 \examplen{Approximating the weight of the MST}
1374 Sometimes we are not interested in the actual edges forming the MST and only
1375 the weight matters. If we are willing to put up with a~randomized approximation,
1376 we can even achieve sub-linear complexity. Chazelle et al.~\cite{chazelle:mstapprox}
1377 have shown an~algorithm which, given $0 < \varepsilon < 1/2$, approximates
1378 the weight of the MST of a~graph with average degree~$d$ and edge weights from the set
1379 $\{1,\ldots,w\}$ in time $\O(dw\varepsilon^{-2}\cdot\log(dw/\varepsilon))$,
1380 producing a~weight which has relative error at most~$\varepsilon$ with probability
1381 at least $3/4$. They have also proven an~almost matching lower bound $\Omega(dw\varepsilon^{-2})$.
1382
1383 For the $d$-dimensional Euclidean case, there is a~randomized approximation
1384 algorithm by Czumaj et al.~\cite{czumaj:euclidean} which with high probability
1385 produces a~spanning tree within relative error~$\varepsilon$ in $\widetilde\O(\sqrt{n}\cdot \poly(1/\varepsilon))$\foot{%
1386 $\widetilde\O(f) = \O(f\cdot\log^{\O(1)} f)$ and $\poly(n)=n^{\O(1)}$.}
1387 queries to a~data structure containing the points. The data structure is expected
1388 to answer orthogonal range queries and cone approximate nearest neighbor queries.
1389 There is also a~$\widetilde\O(n\cdot \poly(1/\varepsilon))$ time approximation
1390 algorithm for the MST weight in arbitrary metric spaces by Czumaj and Sohler \cite{czumaj:metric}.
1391 (This is still sub-linear since the corresponding graph has roughly $n^2$ edges.)
1392
1393 \endpart