
- •1. Введение
- •2. Модуль общего назначения syst.H
- •2.1. Общие сведения
- •2.2. Системные функции и макрооперации
- •2.3. Операции ввода/вывода
- •2.4. Математические функции
- •2.5. Специальные классы. Класс Spline для интерполяции данных сплайнами
- •3. Представление графов, классы и граф-объекты
- •3.1. Представление графов
- •3.2. Таблица связей, класс graph.
- •3.3. Матрицы смежности, класс matad.
- •3.4. Бинарные коды
- •3.5. Таблицы связей с весами вершин, класс graph_v
- •3.6. Таблицы связей с весами ребер, класс graph_r
- •3.7. Таблицы связей с весами вершин и ребер, класс graph_vr
- •3.8. Таблицы связей с координатами вершин, класс imgraph
- •3.9. Класс pinv
- •4. Форматы данных и преобразование форматов
- •4.1. Нумерация вершин графа
- •4.2. Представление графов
- •Int biclen(int n)
- •Int bic_graph(const graph& g, word* bic)
- •Int bic_mat(const matad& m, word* bic)
- •5. Функции создания графа
- •Imgraph::imgraph()
- •Imgraph::imgraph(const imgraph&)
- •6. Операции над графами и граф-объектами
- •Void add_edge(graph& g, int I, int k)
- •7. Ввод/вывод и преобразование файлов
- •Int write_r(file*)
- •Int read_r(file*)
- •Int gt_r(file* in, file* out)
- •Int cmp(const pinv& a, const pinv& b)
- •16. Примеры
- •Литература
- •Алфавитный указатель функций
3.3. Матрицы смежности, класс matad.
В качестве матрицы смежности графа используется матрица с целочисленными элементами. Такая матрица может использоваться для представления неориентированных графов, ориентированных графов, графов с петлями и кратными ребрами. Для выполнения операций с матрицами смежности предусмотрен класс matad, который содержит следующую информацию о графе:
- число вершин nv;
- матрицу смежности графа s(с учетом кратности ребер).
Ниже приводится текст объявления класса matadс комментариями.
class matad
{ public:
int nv; // число вершин
byte **s; // матрица смежности
matad(); // конструктор без параметров
matad(const matad&); // конструтор копирования
matad(const graph&); // конструктор преобразования
matad(int); // конструктор создания безреберного графа
~matad(); // деструктор
matad& operator=(const matad&); // перегрузка присваивания
matad& operator=(const graph&); // присваивание с преобразованием
matad& operator=(int); // операция создания безреберного графа
int size(); // размер объекта в байтах
int form(); // форм-фактор графа
int nrib(); // число ребер
};
Вызов конструктора без параметров matad()приводит к созданию матрицы смежности, соответствующей пустому графу. Размер такого объекта составляет 8 байтов.
Конструктор копирования matad(const matad&) позволяет создать копиюmatad-объекта.
Конструктор преобразования matad(const graph&) создает матрицу смежности по заданной таблице связей.
Конструктор matad(int) создает матрицу смежности безреберного графа с заданным числом вершин.
Деструктор ~matad() удаляет динамическую компонентуmatad-объекта (т.е. массиваs) при его уничтожении.
Функция класса matad& operator = (const matad&) реализует операцию динамического присваивания дляmatad-объектов.
Функция класса matad& operator = (const graph&) реализует присваивание с преобразованием типа. В следующем примере
matad M;
graph g;
........
M = g;
после выполнения присваивания переменная Mполучает значение, соответствующее таблице связейg.
Функция класса matad& operator = (int)позволяет преобразовать матрицу смежности (левый операнд) к значению, которое соответствует безреберному графу с заданным числом вершин. Например, выполнение следующих строк
matad M;
M = 100;
формирует матрицу смежности M, имеющей размер 100х100 и устанавливает все элементы матрицы в нулевое значение.
Операция вида M= 0 приводит матрицу смежностиMк виду, соответствующему пустому графу (сворачивает объект).
Функция класса int size()возвращает размерmatad-объекта в байтах.
3.4. Бинарные коды
Бинарные коды используются для компактного представления обыкновенных графов, т.е. неориентированных графов без петель и кратных ребер. Для получения бинарного кода используется нижняя треугольная часть матрицы смежности (т.е. элементы, лежащие ниже главной диагонали). Подробнее о построении бинарного кода графа см. [5]. Например, для графа из рис.1 бинарный код будет таким: (100011100001011000101) . Класс, соответствующий бинарному коду графа, в составеAlgraphотсутствует, в то же время имеется набор функций, выполняющих основные операции с бинарными кодами. Для хранения бинарных кодов используются одномерные массивы значений типаword(unsignedshort, двухбайтовые беззнаковые данные). Количество элементов массиваL, необходимое для сохранения бинарного кода графа сnвершинами, определяется по следующему правилу:
L= (n(n-1)/2-1)/16+1 . (3.1)
Величину Lбудем называть размером бинарного кода (в отличие от длины бинарного кода, под которой понимается число бит, составляющих бинарный код). Символ " / " в (3.1) означает целочисленное деление. Для графа с 7 вершинами из рис.1 величинаLравна 2. Сам бинарный код имеет длину 21 разряд и, таким образом, 11 бит рабочего массива будут незадействоваными. Эти биты желательно заполнять нулями.
Отметим, что бинарный код графа, сохраненный в массиве типа word, не содержит точной информации о количестве вершин, поэтому это число необходимо сохранять отдельно.
В системе Algraphбинарные коды графов используются для компактного сохранения больших массивов графов с одинаковым числом вершин, для этого предусмотрены специальные форматы файлов (расширения .bicи .r) и соответствующие функции ввода/вывода и преобразования форматов представления графов и файлов в целом.