LAL: Linear Arrangement Library 21.07.01
A library focused on algorithms on linear arrangements of graphs.
|
Rooted tree graph class. More...
#include <rooted_tree.hpp>
Public Member Functions | |
rooted_tree () noexcept | |
Empty constructor. | |
rooted_tree (uint32_t n) noexcept | |
Constructor with number of nodes and root node. | |
rooted_tree (const rooted_tree &r) noexcept | |
Copy constructor. | |
rooted_tree (rooted_tree &&r) noexcept | |
Move constructor. | |
rooted_tree (const free_tree &t, node r) noexcept | |
Constructor with tree and root node. | |
virtual | ~rooted_tree () noexcept |
Destructor. | |
rooted_tree & | operator= (const rooted_tree &r) noexcept |
Copy assignment operator. | |
rooted_tree & | operator= (rooted_tree &&r) noexcept |
Move assignment operator. | |
rooted_tree & | add_edge (node s, node t, bool norm=true, bool check_norm=true) noexcept |
Adds an edge to the tree. | |
rooted_tree & | add_edge_bulk (node s, node t) noexcept |
Adds an edge to the graph. | |
void | finish_bulk_add (bool norm=true, bool check=true) noexcept |
Finishes adding edges in bulk. | |
rooted_tree & | add_edges (const std::vector< edge > &edges, bool norm=true, bool check_norm=true) noexcept |
Adds a list of edges to the graph. | |
rooted_tree & | set_edges (const std::vector< edge > &edges, bool norm=true, bool check_norm=true) noexcept |
Sets the edges to the graph. | |
rooted_tree & | remove_edge (node s, node t, bool norm=false, bool check_norm=true) noexcept |
Remove an edge from this graph. | |
rooted_tree & | remove_edges (const std::vector< edge > &edges, bool norm=true, bool check_norm=true) noexcept |
Remove an edge from this graph. | |
virtual rooted_tree & | remove_edges_incident_to (node u, bool norm=true, bool check_norm=true) noexcept |
Remove all edges incident to a given vertex. | |
void | disjoint_union (const rooted_tree &t, bool connect_roots=true) noexcept |
Disjoint union of trees. | |
bool | find_edge_orientation () noexcept |
Finds the orientation of the edges. | |
void | set_valid_orientation (bool valid) noexcept |
Sets wether the type of the rooted tree is valid or not. | |
void | init_rooted (const free_tree &t, node r) noexcept |
Initialiser with tree and root node. | |
void | calculate_size_subtrees () noexcept |
Calculates the number of nodes at every rooted subtree. | |
void | calculate_tree_type () noexcept |
Calculates the type of tree. | |
void | set_root (node r) noexcept |
Set the root of this tree. | |
bool | is_rooted () const noexcept |
Returns whether this tree is a rooted tree. | |
bool | is_rooted_tree () const noexcept |
Is this tree a valid rooted tree? | |
bool | is_orientation_valid () const noexcept |
Is the orientation of the edges valid? | |
node | get_root () const noexcept |
Return the root of this tree. | |
bool | has_root () const noexcept |
uint32_t | get_num_nodes_subtree (node u) const noexcept |
Get the size of a subtree rooted at a given node. | |
bool | are_size_subtrees_valid () const noexcept |
Is a recalculation of the subtree's sizes needed? | |
std::vector< edge > | get_edges_subtree (node u, bool relab=false) const noexcept |
Retrieve the edges of the subtree rooted at u. | |
rooted_tree | get_subtree (node u) const noexcept |
Retrieve the subtree rooted at node u. | |
free_tree | to_free_tree (bool norm=true, bool check=true) const noexcept |
Converts this rooted tree into a free tree (see free_tree). | |
head_vector | get_head_vector () const noexcept |
Converts a rooted tree into a head vector. | |
void | normalise () noexcept |
Normalises the graph. | |
bool | check_normalised () noexcept |
Checks if the graph is normalised. | |
std::vector< edge_pair > | get_Q () const noexcept |
Returns all independent pairs of edges of this graph. | |
std::vector< edge > | get_edges () const noexcept |
Returns all edges of this graph. | |
bool | has_edge (node u, node v) const noexcept |
Returns true if the edge \((u,v)\) exists in the graph. | |
const neighbourhood & | get_out_neighbours (node u) const noexcept |
Returns the out-neighbours of node u. | |
const neighbourhood & | get_in_neighbours (node u) const noexcept |
Returns the in-neighbours of node u. | |
uint32_t | get_degree (node u) const noexcept |
Returns the in-degree plus the out-degree of this vertex. | |
uint32_t | get_out_degree (node u) const noexcept |
Returns the out-degree of a node. | |
uint32_t | get_in_degree (node u) const noexcept |
Returns the in-degree of a node. | |
bool | is_directed () const noexcept |
Returns whether this graph is directed or not. | |
bool | is_undirected () const noexcept |
Returns whether this graph is undirected or not. | |
undirected_graph | to_undirected (bool norm=true, bool check=true) const noexcept |
Converts this directed graph into an undirected graph. | |
bool | is_tree () const noexcept |
Is this graph is an actual tree? | |
bool | can_add_edge (node s, node t) const noexcept |
Can this edge be added? | |
bool | can_add_edges (const std::vector< edge > &edges) const noexcept |
Can these edges be added? | |
uint32_t | get_num_nodes_component (node u) const noexcept |
Amount of nodes in a connected component of the tree. | |
bool | is_of_tree_type (const tree_type &tt) const noexcept |
Returns whether this tree is of type tt. | |
bool | is_tree_type_valid () const noexcept |
Is the type of this tree valid? | |
std::vector< std::string > | get_tree_type_list () const noexcept |
Returns the list of types as a list of strings. | |
virtual void | init (uint32_t n) noexcept |
Allocates the necessary memory for this class. | |
virtual void | clear () noexcept |
Frees the memory occupied by this graph. | |
void | set_normalised (bool v=true) noexcept |
Sets whether this graph is normalised or not. | |
bool | has_node (node u) const noexcept |
Returns true if node u is in this graph. | |
uint32_t | get_num_nodes () const noexcept |
Returns the number of ndoes. | |
uint32_t | get_num_edges () const noexcept |
Returns the number of edges. | |
bool | is_normalised () const noexcept |
Returns whether this graph is normalised or not. | |
Protected Member Functions | |
virtual void | _init (uint32_t n) noexcept |
virtual void | _clear () noexcept |
void | call_union_find_after_add (node u, node v, uint32_t *const root_of, uint32_t *const root_size) noexcept |
A call to the union find method. | |
void | call_union_find_after_add (node u, node v, uint32_t *const root_of, uint32_t *const root_size) const noexcept |
A const call to the union find method. | |
void | call_union_find_after_remove (node u, node v, uint32_t *const root_of, uint32_t *const root_size) noexcept |
A call to the union find method. | |
void | call_union_find_after_remove (node u, node v, uint32_t *const root_of, uint32_t *const root_size) const noexcept |
A const call to the union find method. | |
void | copy_full_rooted_tree (const rooted_tree &r) noexcept |
Copies all members of this class and the parent class. | |
void | move_full_rooted_tree (rooted_tree &&r) noexcept |
Moves all members of this class and the parent class. | |
void | copy_full_directed_graph (const directed_graph &d) noexcept |
Copies all members of this class and the parent class. | |
void | move_full_directed_graph (directed_graph &&d) noexcept |
Moves all members of this class and the parent class. | |
void | tree_only_init (uint32_t n) noexcept |
Initialises only the memory of class tree. | |
void | tree_only_clear () noexcept |
Clears the memory used by only class tree. | |
void | tree_only_copy (const tree &t) noexcept |
Copies only members of class tree. | |
void | tree_only_move (tree &&t) noexcept |
Moves only members of class tree. | |
void | extra_work_per_edge_add (node u, node v) noexcept |
Do some extra work after an edge has been added. | |
void | extra_work_per_edge_remove (node u, node v) noexcept |
Do some extra work after an edge has been removed. | |
void | tree_only_extra_work_edges_set () noexcept |
void | fill_union_find () noexcept |
void | copy_full_graph (const graph &g) noexcept |
Copies all members of this class. | |
void | move_full_graph (graph &&g) noexcept |
Moves all members of this class. | |
void | __disjoint_union (const graph &g) noexcept |
Disjoint union of graphs. | |
void | normalise_after_add (bool norm, bool check) noexcept |
Normalise the graph after one (or more) edges have been added. | |
void | normalise_after_remove (bool norm, bool check) noexcept |
Normalise the graph after one (or more) edges have been removed. | |
Protected Attributes | |
node | m_root = 0 |
Root of the tree. | |
bool | m_has_root = false |
Has the root been set? | |
bool | m_valid_orientation = false |
Is the orientation of the edges valid? | |
std::vector< uint32_t > | m_size_subtrees |
Number of nodes of the subtrees rooted at a certain node. | |
bool | m_are_size_subtrees_valid = false |
Are the contents of m_size_subtrees valid? | |
std::vector< neighbourhood > | m_in_adjacency_list |
In-neighbours for every node. | |
std::vector< node > | m_root_of |
The root of every vertex in the union-find data structure. | |
std::vector< uint32_t > | m_root_size |
The size of the connected component that a root belongs to. | |
std::array< bool, __tree_type_size > | m_tree_type |
The type of this tree. | |
bool | m_is_tree_type_valid = false |
Is the type of this tree valid? | |
std::vector< neighbourhood > | m_adjacency_list |
Data structure that implements the graph. | |
uint32_t | m_num_edges = 0 |
Amount of edges of this graph. | |
bool | m_normalised = true |
Is this graph normalised? | |
Private Member Functions | |
void | disjoint_union (const directed_graph &g) noexcept |
Disjoint union of graphs. | |
void | remove_single_edge (node u, node v, neighbourhood &out_u, neighbourhood &in_v) noexcept |
Removes a single edge. | |
Rooted tree graph class.
This class provides its users with an abstraction of rooted trees. Rooted trees are free trees in which one vertex has been designated as the root. Furthermore, in the context of this library, these trees' edges are always oriented towards the leaves (away from the root); this is known as an arborescence. Many methods require objects of this class to be valid rooted trees: the object must be a tree (see is_tree), must have a root (see has_root), and be a valid rooted tree (be an arborescence, that is, see is_orientation_valid).
Rooted trees can be constructed in two different ways:
Adding edges one by one has a serious drawback. In case the edges do not have a consistent orientation (either always pointing away from the root or always pointing towards it), the resulting graph is not considered to be a valid rooted tree (see is_rooted_tree). Due to efficiency reasons, orientation of edges is not checked before or after their addition. Recall that removal of edges is allowed at every moment.
The root allows defining further properties on these graphs. For example, the user can query information regarding subtrees of a particular rooted tree (see methods get_num_nodes_subtree, calculate_size_subtrees, get_edges_subtree, and get_subtree).
This class allows flexibility of use of rooted trees regarding the root's choice. Method set_root allows changing the root of rooted trees multiple times and at any time. However, any information dependent on the root becomes invalid upon any change of the root. This information includes, and may not be limited to, the type of rooted tree and the size of the subtrees (see get_num_nodes_subtree). For this reason, is is strongly recommended to build a free tree first and use the constructor rooted_tree(const free_tree&, node), or the method init_rooted, in order to build rooted trees.
|
inlinenoexcept |
Constructor with number of nodes and root node.
n | Number of vertices. |
|
inlinenoexcept |
Copy constructor.
r | Rooted tree. |
|
inlinenoexcept |
Move constructor.
r | Rooted tree. |
|
protectednoexceptinherited |
Disjoint union of graphs.
Given a graph, append it to the current graph.
All the nodes in g are relabelled starting at n, the number of nodes of the current graph.
g | Input graph. |
|
protectedvirtualnoexcept |
Clears the memory of rooted_tree, undirected_graph and graph classes.
Reimplemented from lal::graphs::directed_graph.
|
protectedvirtualnoexcept |
Initialises memory of rooted_tree, undirected_graph and graph classes.
Reimplemented from lal::graphs::directed_graph.
|
virtualnoexcept |
Adds an edge to the tree.
This operation checks that the edge added does not produce cycles only in a debug compilation of the library. For a more controlled addition of the edges, see can_add_edge.
For developers: method graph::extra_work_per_edge_add is called after the edge has been added.
s | Valid node index: \(0 \le s < n\). |
t | Valid node index: \(0 \le t < n\). |
norm | Should the graph be normalised? |
check_norm | If norm is false then, should we check whether the result is normalised or not? This might be useful in case the resulting graph is normalised. If norm is true then check_norm is ignored. |
Reimplemented from lal::graphs::directed_graph.
|
noexcept |
Adds an edge to the graph.
This method only adds an edge, and does no other work: normalisation is not checked, and no extra work per edge is done.
s | Valid node index: \(0 \le s < n\). |
t | Valid node index: \(0 \le t < n\). |
|
virtualnoexcept |
Adds a list of edges to the graph.
This function checks that edges will not produce cycles only in a debug compilation of the library. Moreover, this operation is faster than calling add_edge since the edges are added in bulk. For a more controlled addition of the edges, see can_add_edges.
For developers: method graph::extra_work_per_edge_add is called after each edge has been added.
edges | The edges to be added. |
norm | Normalise the graph after the insertions. |
check_norm | If norm is false then, should we check whether the result is normalised or not? This might be useful in case the resulting graph is normalised. If norm is true then check_norm is ignored. |
Reimplemented from lal::graphs::directed_graph.
|
inlinenoexcept |
Is a recalculation of the subtree's sizes needed?
If the method returns false then the user should call calculate_size_subtrees so that the size of every rooted subtree is recalculated. This information must be calculated prior to calling many functions of this library.
|
noexcept |
Calculates the number of nodes at every rooted subtree.
|
virtualnoexcept |
Calculates the type of tree.
See tree_type for the list of different tree types.
Implements lal::graphs::tree.
|
protectedvirtualnoexcept |
A const call to the union find method.
This is a helper method to be able to call a template in the lal::internal namespace which updates the union find data structure under addition of an edge.
u | Node that is connected to v. |
v | Node that is connected to u. |
root_of | Array of n elements relating each vertex to its root in the union find data structure. |
root_size | Array of n elements relating each vertex to the size of the connected component it belongs to. |
Implements lal::graphs::tree.
|
protectedvirtualnoexcept |
A call to the union find method.
This is a helper method to be able to call a template in the lal::internal namespace which updates the union find data structure under addition of an edge.
u | Node that is connected to v. |
v | Node that is connected to u. |
root_of | Array of n elements relating each vertex to its root in the union find data structure. |
root_size | Array of n elements relating each vertex to the size of the connected component it belongs to. |
Implements lal::graphs::tree.
|
protectedvirtualnoexcept |
A const call to the union find method.
This is a helper method to be able to call a template in the lal::internal namespace which updates the union find data structure under removal of an edge.
u | Node that is connected to v. |
v | Node that is connected to u. |
root_of | Array of n elements relating each vertex to its root in the union find data structure. |
root_size | Array of n elements relating each vertex to the size of the connected component it belongs to. |
Implements lal::graphs::tree.
|
protectedvirtualnoexcept |
A call to the union find method.
This is a helper method to be able to call a template in the lal::internal namespace which updates the union find data structure under removal of an edge.
u | Node that is connected to v. |
v | Node that is connected to u. |
root_of | Array of n elements relating each vertex to its root in the union find data structure. |
root_size | Array of n elements relating each vertex to the size of the connected component it belongs to. |
Implements lal::graphs::tree.
Can this edge be added?
In a tree, an edge can only be added if it does not produce cycles, and it has not been added before.
s | First node of the edge. |
t | Second node of the edge. |
|
noexceptinherited |
Can these edges be added?
In a tree, a set of edges can only be added if their addition to the tree do not produce cycles and none of them have been added before.
edges | List of edges. |
|
virtualnoexceptinherited |
Checks if the graph is normalised.
Checks, whether the graph's adjacency structure is normalised or not. In case it is, attribute m_normalised is set to true, so method is_normalised evaluates to true.
Reimplemented from lal::graphs::graph.
|
virtualnoexceptinherited |
Frees the memory occupied by this graph.
See _clear for details.
|
privatenoexcept |
Disjoint union of graphs.
Given a graph, append it to the current graph.
All the nodes in g are relabelled starting at n, the number of nodes of the current graph.
g | Input graph. |
|
noexcept |
Disjoint union of trees.
Append a rooted tree to this tree. All the nodes in t are relabelled starting at n, the number of nodes of the current tree. If the current graph has no vertices, then the contents of t are simply copied into this graph.
t | Input tree. |
connect_roots | The root of the current tree and the root of t are joined by an edge. |
|
protectednoexceptinherited |
Fills the Union-Find data structure assuming that the graph structure has all of its edges.
|
noexcept |
Finds the orientation of the edges.
It is mandatory that this tree be an arborescence. Therefore, when the tree has been built by adding edges (see add_edge, add_edges), the user must tell this class whether what has been built is an arborescence or not. One can do this by calling method find_edge_orientation or by setting the type directly using method set_valid_orientation.
This method examines the orientation of the tree's edges with respect to the root and to the leaves, i.e., it determines whether all edges are oriented towards the leaves (away from the root).
|
virtualnoexcept |
Finishes adding edges in bulk.
norm | Normalise the tree. |
check | Check whether the tree is normalised or not. |
Reimplemented from lal::graphs::directed_graph.
|
inlinenoexceptinherited |
Returns the in-degree plus the out-degree of this vertex.
Returns the degree of this vertex in its underlying undirected structure. Same as get_in_degree + get_out_degree.
u | Vertex |
|
noexcept |
Retrieve the edges of the subtree rooted at u.
The list of edges returned contains labels that depend on the parameter relab. If relab is true then the nodes are relabelled to numbers in \([0, n_u)\), where \(n_u\) is the number of nodes of the subtree rooted at u, rather than keeping the original labelling of numbers in \([0,n)\), where n is the number of nodes of the tree.
In case of directed trees, the subtree is extracted regardless of the orientation of the edges. For example, consider the following complete binary tree of 7 nodes, whose edges are
0 -> 1 -> 3 -> 4 -> 2 -> 5 -> 6
The edges of the subtree rooted at 1 are "1 -> 3" and "1 -> 4". Moreover, the orientation of the edges in the new tree is kept.
This method can be seen as a way of relabelling nodes when u is the root of the tree and relab is true.
u | Root node of the subtree. |
relab | Should the nodes be relabelled? |
|
noexcept |
Converts a rooted tree into a head vector.
A head vector of an n-vertex tree is a list of non-negative integer numbers. The number at position i denotes the parent node of the vertex at said position. Value '0' denotes the root. In this case, the vertex corresponding to the value '0' is not labelled as a root.
Each tree is formatted as a list of whole, positive numbers (including zero), each representing a node of the tree. The number 0 denotes the root of the tree, and a number at a certain position indicates its parent node. For example, when number 4 is at position 9 it means that node 9 has parent node 4. Therefore, if number 0 is at position 1 it means that node 1 is the root of the tree. A complete example of such a tree's representation is the following
0 3 4 1 6 3
which should be interpreted as
(a) predecessor: 0 3 4 1 6 3 (b) node of the tree: 1 2 3 4 5 6
Note that lines like these are not valid:
(1) 0 2 2 2 2 2 (2) 2 0 0
Line (1) is not valid due to a self-reference in the second position, and (2) is not valid since it contains two '0' (i.e., two roots).
Methods lal::io::read_head_vector read a head vector from a file in disk.
|
inlinenoexceptinherited |
Returns the in-neighbours of node u.
u | Node |
|
inlinenoexceptinherited |
Amount of nodes in a connected component of the tree.
When tree has had an edge removed, or when it is not completely built, i.e., it lack some edges, the resulting graph is clearly a forest. This function returns the size of the forest node u belongs to.
In directed trees one has to see this amount as the number of nodes of the component in the undirected version of the forest.
u | Input node. |
|
inlinenoexcept |
Get the size of a subtree rooted at a given node.
u | Vertex of the tree. |
|
inlinenoexceptinherited |
Returns the out-neighbours of node u.
u | Node |
|
virtualnoexceptinherited |
Returns all independent pairs of edges of this graph.
The set \(Q(G)\) is defined as the pairs of edges of \(G\), \(E(G) \times E(G)\), that are independent, that is, that share no nodes.
Implements lal::graphs::graph.
|
noexcept |
Retrieve the subtree rooted at node u.
u | Root of the subtree. |
|
noexceptinherited |
Returns the list of types as a list of strings.
|
inlinenoexcept |
Returns whether this rooted tree's root has been set or not (see set_root).
|
virtualnoexceptinherited |
Initialiser with tree and root node.
Constructs a rooted tree from a free tree and one of its nodes as the root of the rooted tree.
Since the edges are oriented, method is_tree must be true on parameter t (otherwise, some edges might not be reachable from the root and hence completely undirectable).
t | Undirected tree. |
r | Root of the directed tree. A node of g. |
|
inlinenoexceptinherited |
Returns whether this graph is normalised or not.
A graph is normalised if every node's adjacency list is sorted increasingly. For this, use method normalise().
|
inlinenoexceptinherited |
Returns whether this tree is of type tt.
See method calculate_tree_type to know how to calculate a tree's type.
tt | Type of tree (see lal::graphs::tree_type). |
|
inlinenoexcept |
Is the orientation of the edges valid?
The edges' orientation is valid if they are all oriented towards the leaves (away from the root).
This function returns the value of private attribute m_valid_orientation.
|
inlinenoexcept |
Is this tree a valid rooted tree?
A tree is a valid rooted tree when:
|
inlinenoexceptinherited |
Is this graph is an actual tree?
Returns true if the number of edges is one less than the number of nodes. Note that this would not really be true if the addition of edges was not constrained. Since it is constrained in a way that no cycles can be produced (for example, see free_tree::add_edge, or free_tree::add_edges), then we only need to check for the number of edges.
For further characterisations of a tree see [19] (chapter 4, pages 32-33).
|
inlinenoexceptinherited |
Is the type of this tree valid?
This function enables users determine when this tree's type should be calculated.
In case this function returns false, users should call function calculate_tree_type in order to obtain a valid tree type. Note, however, that prior to calling the function the type of this tree might be lal::graphs::tree_type::unknown and that the tree type may remain lal::graphs::tree_type::unknown even after the type has been calculated. Nevertheless, users should be suspicious of a tree being of lal::graphs::tree_type::unknown (in fact, of any) type if this method returns false, yet they should be sure of it if the type was calculated via method calculate_tree_type.
|
virtualnoexceptinherited |
Normalises the graph.
Sorts this graph's adjacency list structure in increasing order.
Besides expensive, this method may be unnecessary. Method check_normalised() checks whether the graph is normalised or not; in case it is, using this method is completely unnecessary.
Reimplemented from lal::graphs::graph.
|
inlinenoexcept |
Copy assignment operator.
r | Rooted tree. |
|
inlinenoexcept |
Move assignment operator.
r | Rooted tree. |
|
virtualnoexcept |
Remove an edge from this graph.
For developers: method graph::extra_work_per_edge_remove is called after the edge has been removed.
s | Valid node index: \(0 \le s < n\). |
t | Valid node index: \(0 \le t < n\). |
norm | Normalise the graph after the deletion. |
check_norm | If norm is false then, should we check whether the result is normalised or not? This might be useful in case the resulting graph is normalised. If norm is true then check_norm is ignored. |
Reimplemented from lal::graphs::directed_graph.
|
virtualnoexcept |
Remove an edge from this graph.
This operation is faster than removing edges one by one with remove_edge(node,node,bool,bool) since the edges are removed in bulk.
For developers: method graph::extra_work_per_edge_remove is called after each edge has been removed.
edges | The edges to be deleted. |
norm | Normalise the graph after the deletion. |
check_norm | If norm is false then, should we check whether the result is normalised or not? This might be useful in case the resulting graph is normalised. If norm is true then check_norm is ignored. |
Reimplemented from lal::graphs::directed_graph.
|
virtualnoexcept |
Remove all edges incident to a given vertex.
This operation is faster than removing edges one by one with remove_edge(node,node,bool,bool) since the edges are removed in bulk.
For developers: method lal::graphs::graph::extra_work_per_edge_remove is called after each edge has been removed.
u | The node whose incident vertices are to be removed. |
norm | Normalise the graph after the deletion. |
check_norm | If norm is false then, should we check whether the result is normalised or not? This might be useful in case the resulting graph is normalised. If norm is true then check_norm is ignored. |
Reimplemented from lal::graphs::directed_graph.
|
privatenoexceptinherited |
Removes a single edge.
u | First node of edge. |
v | Second node of edge. |
out_u | Out-neighbourhood of node u. |
in_v | In-neighbourhood of node v. |
|
virtualnoexcept |
Sets the edges to the graph.
Sets the edges of this graph assuming that the nodes indexed in the list are, at most, the number of nodes of this graph.
This list of edges is assumed to be all the edges that are going to be added to this graph. This means that the internal data structures are constructed more efficiently than when adding edges one by one (see add_edge) or in several chunks (see add_edges). For a more controlled addition of the edges, see can_add_edges.
Moreover, the current structure of the graph is cleared before setting the new edges.
edges | The edges to be added. |
norm | Normalise the graph after the insertions. |
check_norm | If norm is false then, should we check whether the result is normalised or not? This might be useful in case the resulting graph is normalised. If norm is true then check_norm is ignored. |
Reimplemented from lal::graphs::directed_graph.
|
noexcept |
Set the root of this tree.
Changing the root of a rooted tree invalidates information dependant on the tree. See the postconditions for details.
r | Vertex that represents the root. |
|
inlinenoexcept |
Sets wether the type of the rooted tree is valid or not.
It is mandatory that this tree be an arborescence. Therefore, when the tree has been built by adding edges (see add_edge, add_edges), the user must tell this class whether what has been built is an arborescence or not. One can do this by calling method find_edge_orientation or by setting the type directly using method set_valid_orientation.
valid | Boolean value telling whether the tree is valid or not. |
|
noexcept |
Converts this rooted tree into a free tree (see free_tree).
norm | Normalise the tree. |
check | Chech whether the resulting graph is normalised or not. |
|
noexceptinherited |
Converts this directed graph into an undirected graph.
The undirected graph returned connects two vertices \(u,v\) if these two vertices are connected by a directed edge ( \((u,v)\) or \((v,u)\)) in this graph. In other words, if two vertices are connected by a single directed edge, the direction is dropped. If two edges are connected by two directed edges (of opposite directions) then the two are merged into a single undirected edge.
norm | Normalise the graph. |
check | Chech whether the resulting graph is normalised or not. |
|
protectednoexceptinherited |
Updates the data structures of a tree after the graph structure has had its set of edges set.
|
protectednoexceptinherited |
Initialises only the memory of class tree.
n | Number of vertices. |
|
protectedinherited |
Is the type of this tree valid?
This attribute keeps track of whether or not the function calculate_tree_type should be called before querying the type of this tree via function is_of_tree_type.
|
protectedinherited |
Is this graph normalised?
An undirected graph is normalised iff every node's adjacency list is sorted in increasing order.
In directed graphs, however, it is necessary that the adjacency lists of the out-neighbours and in-neighbours of nodes be sorted.
This attribute is set to 'true' in all graph's initialisation and destruction (when clear() method is called).
|
protectedinherited |
The size of the connected component that a root belongs to.
Formally, m_size_of[v] is the size of the connected component of a root vertex v. A vertex u is a root vertex if there exists a vertex w such that m_root_of[w] = u.
In this context, root is within the union-find data structure.
|
protected |
Number of nodes of the subtrees rooted at a certain node.
Given a node u, m_size_subtrees[u] gives the number of nodes of the subtree rooted at u.