LAL: Linear Arrangement Library 21.07.01
A library focused on algorithms on linear arrangements of graphs.
Loading...
Searching...
No Matches
is_tree.hpp
1/*********************************************************************
2 *
3 * Linear Arrangement Library - A library that implements a collection
4 * algorithms for linear arrangments of graphs.
5 *
6 * Copyright (C) 2019 - 2021
7 *
8 * This file is part of Linear Arrangement Library. To see the full code
9 * visit the webpage:
10 * https://github.com/lluisalemanypuig/linear-arrangement-library.git
11 *
12 * Linear Arrangement Library is free software: you can redistribute it
13 * and/or modify it under the terms of the GNU Affero General Public License
14 * as published by the Free Software Foundation, either version 3 of the
15 * License, or (at your option) any later version.
16 *
17 * Linear Arrangement Library is distributed in the hope that it will be
18 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU Affero General Public License for more details.
21 *
22 * You should have received a copy of the GNU Affero General Public License
23 * along with Linear Arrangement Library. If not, see <http://www.gnu.org/licenses/>.
24 *
25 * Contact:
26 *
27 * LluĂ­s Alemany Puig (lalemany@cs.upc.edu)
28 * LARCA (Laboratory for Relational Algorithmics, Complexity and Learning)
29 * CQL (Complexity and Quantitative Linguistics Lab)
30 * Jordi Girona St 1-3, Campus Nord UPC, 08034 Barcelona. CATALONIA, SPAIN
31 * Webpage: https://cqllab.upc.edu/people/lalemany/
32 *
33 * Ramon Ferrer i Cancho (rferrericancho@cs.upc.edu)
34 * LARCA (Laboratory for Relational Algorithmics, Complexity and Learning)
35 * CQL (Complexity and Quantitative Linguistics Lab)
36 * Office S124, Omega building
37 * Jordi Girona St 1-3, Campus Nord UPC, 08034 Barcelona. CATALONIA, SPAIN
38 * Webpage: https://cqllab.upc.edu/people/rferrericancho/
39 *
40 ********************************************************************/
41
42#pragma once
43
44// lal includes
45#include <lal/internal/graphs/traversal.hpp>
46
47namespace lal {
48namespace internal {
49
50/*
51 * @brief Returns true if, and only if, the graph is a tree.
52 *
53 * By definition, an undirected graph is a tree if it does not contain
54 * cycles and has one single connected component. Note that isloated nodes
55 * count as single connected components. Directed graphs are allowed.
56 * @param g Input graph.
57 */
58template<class G>
59bool is_graph_a_tree(const G& g) {
60 const auto n = g.get_num_nodes();
61
62 // simple cases
63 if (n <= 1) { return true; }
64 if (n == 2) { return g.get_num_edges() == 1; }
65 if (n == 3) { return g.get_num_edges() == 2; }
66
67 // check exact amount of edges
68 if (g.get_num_edges() != g.get_num_nodes() - 1) { return false; }
69
70 // visit all vertices, if all vertices
71 // were visited then the graph is a tree
72 BFS<G> bfs(g);
73 bfs.set_use_rev_edges(g.is_directed());
74 bfs.start_at(0);
75 return bfs.all_visited();
76}
77
78} // -- namespace internal
79} // -- namespace lal
Main namespace of the library.
Definition definitions.hpp:48