Graph::UnionFind(3) union-find data structures

## SYNOPSIS

use Graph::UnionFind;
my \$uf = Graph::UnionFind->new;
# Add the vertices to the data structure.
# Join the partitions of the vertices.
\$uf->union( \$u, \$v );
# Find the partitions the vertices belong to
# in the union-find data structure. If they
# are equal, they are in the same partition.
# If the vertex has not been seen,
# undef is returned.
my \$pu = \$uf->find( \$u );
my \$pv = \$uf->find( \$v );
\$uf->same(\$u, \$v) # Equal to \$pu eq \$pv.
# Has the union-find seen this vertex?
\$uf->has( \$v )

## DESCRIPTION

Union-find is a special data structure that can be used to track the partitioning of a set into subsets (a problem known also as disjoint sets).

Graph::UnionFind() is used for Graph::connected_components(), Graph::connected_component(), and Graph::same_connected_components() if you specify a true "union_find" parameter when you create an undirected graph.

Note that union-find is one way: you cannot (easily) 'ununion' vertices once you have 'unioned' them. This means that if you delete edges from a "union_find" graph, you will get wrong results from the Graph::connected_components(), Graph::connected_component(), and Graph::same_connected_components().

## API

```    \$uf->add(\$v)
```

Add the vertex v to the union-find.

union
```    \$uf->union(\$u, \$v)
```

Add the edge u-v to the union-find. Also implicitly adds the vertices.

has
```    \$uf->has(\$v)
```

Return true if the vertex v has been added to the union-find, false otherwise.

find
```    \$uf->find(\$v)
```

Return the union-find partition the vertex v belongs to, or "undef" if it has not been added.

new
```    \$uf = Graph::UnionFind->new()
```

The constructor.

same
```    \$uf->same(\$u, \$v)
```

Return true of the vertices belong to the same union-find partition the vertex v belongs to, false otherwise.