From c1b6ffe70bd281c6c230fd63fabcaac2aff47514 Mon Sep 17 00:00:00 2001 From: Fuwn Date: Sun, 7 Apr 2024 23:18:32 -0700 Subject: feat: initial commit --- chapter15/graph.template | 100 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 chapter15/graph.template (limited to 'chapter15/graph.template') diff --git a/chapter15/graph.template b/chapter15/graph.template new file mode 100644 index 0000000..781568a --- /dev/null +++ b/chapter15/graph.template @@ -0,0 +1,100 @@ +// FILE: graph.template (part of the namespace main_savitch_15) +// TEMPLATE CLASS IMPLEMENTED: graph (See graph.h for documentation.) +// This file is included in the header file and not compiled separately. +// INVARIANT for the graph class: +// 1. The number of vertices in the graph is stored in the member variable +// many_vertices. +// 1. These vertices are numbered from 0 to many_vertices-1. +// 2. edges is the adjacency matrix for the graph (with true in edges[i][j] +// to indicate an edge from vertex i to vertex j). +// 3. For each i < many_vertices, labels[i] is the label of vertex i. + +#include // Provides assert +#include // Provides size_t +#include // Provides set + +namespace main_savitch_15 +{ + template + const std::size_t graph::MAXIMUM; + + template + void graph::add_edge(std::size_t source, std::size_t target) + // Library facilities used: cassert, cstdlib + { + assert(source < size( )); + assert(target < size( )); + edges[source][target] = true; + } + + template + void graph::add_vertex(const Item& label) + // Library facilities used: cassert, cstdlib + { + std::size_t new_vertex_number; + std::size_t other_number; + + assert(size( ) < MAXIMUM); + new_vertex_number = many_vertices; + many_vertices++; + for (other_number = 0; other_number < many_vertices; ++other_number) + { + edges[other_number][new_vertex_number] = false; + edges[new_vertex_number][other_number] = false; + } + labels[new_vertex_number] = label; + } + + template + bool graph::is_edge(std::size_t source, std::size_t target) const + // Library facilities used: cassert, cstdlib + { + assert(source < size( )); + assert(target < size( )); + return edges[source][target]; + } + + template + Item& graph::operator[ ] (std::size_t vertex) + // Library facilities used: cassert, cstdlib + { + assert(vertex < size( )); + return labels[vertex]; // Returns a reference to the label + } + + template + Item graph::operator[ ] (std::size_t vertex) const + // Library facilities used: cassert, cstdlib + { + assert(vertex < size( )); + return labels[vertex]; // Returns only a copy of the label + } + + template + std::set graph::neighbors(std::size_t vertex) const + // Library facilities used: cassert, cstdlib, set + { + std::set answer; + std::size_t i; + + assert(vertex < size( )); + + for (i = 0; i < size( ); ++i) + { + if (edges[vertex][i]) + answer.insert(i); + } + return answer; + } + + template + void graph::remove_edge(std::size_t source, std::size_t target) + // Library facilities used: cassert, cstdlib + { + assert(source < size( )); + assert(target < size( )); + edges[source][target] = false; + } +} + + -- cgit v1.2.3