
- •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. Примеры
- •Литература
- •Алфавитный указатель функций
4. Форматы данных и преобразование форматов
4.1. Нумерация вершин графа
Компоненты классов и другие объекты и функции, связанные с графами, предусматривают нумерацию вершин, начиная с нуля. Это соответствует традициям языка С и позволяет более экономно использовать память. В то же время для внешнего представления графов используется более привычная для публикаций нумерация вершин графа, начиная с единицы. При выполнении операций, представленных средствами библиотеки Algraph/C++, переход от одного способа нумерации к другому выполняется автоматически. Например, при выводе значения типаgraph(таблица связей графа) на экран или в текстовый файл будет выполнен переход от внутренней нумерации вершин к внешней.
4.2. Представление графов
Для представления графов могут использоваться следующие форматы:
- graph(таблица связей, невзвешенные неориентированные или ориентированные графы, графы с петлями и кратными ребрами);
- graph_v(то же самое, но для графов взвешенных по вершинам);
- graph_r(то же самое, но для графов взвешенных по ребрам);
- graph_vr(то же самое, но для графов взвешенных и по вершинам и по ребрам);
- matad(матрица смежности, невзвешенные неориентированные или ориентированные графы, графы с петлями и кратными ребрами);
- int(безреберные графы);
- бинарные коды (невзвешенные неориентированные графы без петель и кратных ребер), сохраняются в строках типа word* или в файлах .bicили .rтипа.
При выполнении операции присваивания формат представления графа в некоторых случаях преобразуется автоматически, при этом используется набор функций, перегружающих операцию присваивания. Возможные варианты такого преобразования показаны в таблице 2. Тип левого операнда операции присваивания указан в первой колонке таблицы, тип правого операнда - в первой строке.
Таблица 2. Возможные преобразования форматов представления графов при выполнении операции присваивания
|
graph |
graph_v |
graph_r |
graph_vr |
imgraph |
matad |
int |
graph |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
graph_v |
+ |
+ |
- |
+ |
- |
+ |
+ |
graph_r |
+ |
- |
+ |
+ |
- |
+ |
+ |
graph_vr |
+ |
- |
- |
+ |
- |
+ |
+ |
imgraph |
+ |
- |
- |
- |
+ |
+ |
+ |
matad |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
int |
+ |
+ |
+ |
+ |
+ |
+ |
+ |
При выполнении автоматического преобразования при выполнении операции присваивания действует следующее правило: если правый операнд не содержит информации для инициализации некоторого поля (компонента) левого операнда, оно (он) инициализируется нулем или пустым значением. Например, при выполнении таких строк приграммы
matad M;
graph_r gr;
int n = 20;
M = n;
gr = n;
переменная Mбудет представлять матрицу смежности 20-вершинного безреберного графа (все элементы матрицы будут равны нулю), а переменнаяgrбудет содержать таблицу связей 20-вершинного безреберного графа и пустой (не имеющий ни одного элемента) массив весов его ребер.
Ниже приводятся функции, которые используются для преобразований при использовании бинарных кодов.