
- •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. Примеры
- •Литература
- •Алфавитный указатель функций
7. Ввод/вывод и преобразование файлов
Для сохранения графов в дисковых файлах могут использоваться файлы нескольких типов. Связь между расширением имени файла и форматом сохраняемых данных:
.gt- таблицы связей в текстовой форме,
.bic- бинарные коды в текстовом 16-ричном формате;
.r- бинарные коды графов в бинарной форме.
Функции класса graph
graph& graph::operator<<(FILE*)
graph& graph::operator>>(FILE*)
перегружают символы "<<" и ">>" для выполнения операций ввода и вывода graph-объектов в текстовой форме во внешнем формате, предусмотренном для таблицы связей. Пусть, например, переменнаяgтипаgraphсоответствует графу из рис.1. Тогда выполнение строки
g >> f;
приведет к выводу таблицы связей графа в файл с указателем f. При этом вывод будет осуществлен в следующем формате:
0 7
1 2 2 5
2 3 1 4 6
3 1 4
4 4 2 3 6 7
5 2 1 6
6 4 2 4 5 7
7 2 4 6
Первая строка содержит два значения: форм-фактор (для неориентированных графов без петель и кратных ребер он равен нулю) и число вершин графа. Последующие строки образуют таблицу, в которой первый столбец содержит номера вершин (внешняя нумерация), второй столбец содержит степени соответствующих вершин (полустепени исхода для орграфов), с третьей позиции строки записываются номера смежных вершин (концевых вершин исходящих дуг для орграфов).
В примере, приведенном ниже, из файла fin.gtчитается таблица связей графаg, выполняется упорядочивание номеров вершин в ее строках и после этого значениеgзаписывается в файлfout.gt.
FILE* in = fopen("fin.gt","r");
FILE* out = fopen("fout.gt","w");
graph g;
g<<in; g.rgl(); g>>out;
Для вывода таблицы связей графа gна экран можно записать вывод переменнойgв стандартное устройство выводаstdout:
g>>stdout;
Функции класса graph
Int write_r(file*)
Int read_r(file*)
позволяют записывать в файл и считывать из файла бинарный код графа. Функция write_rвначале преобразует таблицу связей в бинарный код необходимой длины и затем записывает его в файл в режиме бинарного доступа. Функцияread_rсчитывает бинарный код из файла и формирует соответствующую таблицу связей. При этом передаваемый бинарный код является "чистым", т.е. не включает непосредственно число вершин графа. В связи с этим функцииread_rиwrite_rиспользуются для работы с файлами, которые содержат наборы бинарных кодов графов с одинаковым числом вершин. Имена таких файлов имеют расширение.r. Первые 12 байтов такого файла образуют шапку, поля которой содержат общую информацию о его содержимом, далее располагаются бинарные коды.Общая структураr-файла приведена ниже.
-
nv: число вершин (2 байта)
nr: число ребер (2 байта)
Ng: количество бинарных кодов (4 байта)
KS: контрольная сумма (4 байта)
1-й бинарный код
2-й бинарный код
..............................
В r-файл можно записывать бинарные коды графов с числом вершинnv1024.
Если используемый r-файл содержит бинарные коды графов с неодинаковым числом ребер, полеnrпо прямому назначению (или вовсе) не используется.
В связи с тем, что бинарные коды не содержат непосредственно число вершин графа, последнее берется из объекта, для которого вызывается функция readbic. Например, если мы имеем файлin.rи объявление переменнойg:
graph g;
то для того, чтобы выполнить чтение бинарного кода из файла in.rв переменнуюg, необходимо занести в нее информацию о числе вершин считываемого графа. Например, при считывании бинарного кода 20-вершинного графа в переменнуюgэта операция может быть записана таким способом:
g = 20; g.readbic();
или так:
(g=20).readbic();