Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Основы объектно-ориентированного программирования задач на графах. Учебное пособие
.pdf
8.3. Программирование функции определения семейства клик, покрывающего…
91
//--копирование строки матрицы смежности с номером i+1
//--в массив M[]-------------
for(int j=0; j<N; j++)
M[j]= matr[i][j];
//---логическое произведение элементов массива М и
//---и строки j матрицы, для которой M[j]==1
for (int j=0; j<N; j++)
if(M[j]==1)
{
Cl[z++]=j+1;
cout<<" nomer="<<z<<' '<<Cl[z-1];
for(int l=j+1; l<N; l++)
M[l]= M[l]*matr[j][l];
}
//---помечаем вершины, покрытые кликой------------
for(int i1=0; i1<z; i1++)
P[Cl[i1]-1]=1;
//---вывод на экран номеров вершин выделенной клики--
cout<<endl<<" Klika=";
for(int i1=0; i1<z; i1++)
cout<<Cl[i1]<<' ';
}
}
//--- удаление из динамической памяти массивов---
delete[] M;
delete[] P;
delete[]Cl;
getch();
}

8. Программирование задач на графах повышенной сложности
92
8.4. Структура главной функции в ООП
В прил. 7 приведен полный код программы, включая главную функцию:
int main()
{
textcolor(BLACK);
textbackground(WHITE);
clrscr();
Task t1 (6);
t1.rand_graph();
t1.output_graph();
t1.task1();
t1.rand_graph();
t1.output_graph();
t1.task2();
getch();
return 0;
}
Для изменения цвета фона и текста, как и в других программах пособия, использованы операторы:
textcolor(BLACK);
textbackground(WHITE);
clrscr();
Создаем объект t1 класса Task:
Task t1 (6);
Операторы:
t1.rand_graph();
t1.output_graph();
создают «случайный» граф и выводят матрицу смежности на экран.
Оператор:
t1.task1();

8.4. Структура главной функции в ООП
93
вызывает функцию task1() класса Task для объекта t1, которая
выделяет паросочетание в графе.
Затем для решения задачи определения семейства клик, покрываю-
щих все вершины графа, приходится снова генерировать «случайный»
граф, поскольку функция t1.task1() при определении паросочетания
присвоила всем элементам матрицы нулевые значения:
t1.rand_graph();
t1.output_graph();
t1.task2();
На рис. 30 представлен результат работы программы – определения
паросочетания графа и семейства клик, покрывающих все вершины графа с
шестью вершинами.
Рис. 30. Результат работы программы – определения паросочетания графа
и семейства клик, покрывающего все вершины графа с 6-ю вершинами

8. Программирование задач на графах повышенной сложности
94
Стиль объектно-ориентированого программирования на С++ предполагает, что главная функция должна только создать объект класса, а вызовы всех необходимых функций для решения задачи производятся из функций соответствующих классов. Для этого создают отдельный класс, например, TApplication, в конструкторе которого производятся вызовы
функций классов, необходимых для решения задачи. При этом в главной
функции досточно создать объект класса TApplication и вызвать конструктор этого класса.
Второй вариант заключается в создании в классе, самом нижнем в
иерархии классов, функции Run(), которая выполняет все действия, которые должны были быть выполнены в главной функции для решения задачи.
Тогда в главной функции достаточно создать объект класса, в котором объявлена функция Run(), и вызвать эту функцию.
Рассмотрим второй варинт. Объявим функцию Run(), в классе
Task. Тогда функция Run() будет «видеть» все данные и функции класса
Task и базовых классов Graph и Matr.
Объявление класса Task с дополнительной функцией Run() будет таким:
class Task : public Matr
{
public: Task(int n1) : Matr(n1){};
void task1();
void task2();
void Run();
};
Функциия Run(), размещенная вне класса Task, будет иметь вид:
void Task::Run()
{
textcolor(BLACK);
textbackground(WHITE);
clrscr();
rand_graph();
output_graph();

8.4. Структура главной функции в ООП
95
task1();
rand_graph();
output_graph();
task2();
}
Объекты в функции Run() не создаются, а только вызываются
функции классов Task, Graph и Matr.
В свою очередь, главная функция будет иметь следующий состав
операторов:
int main()
{
Task t1 (8);
t1.Run();
getch();
return 0;
}
Объединим рассмотренные части программы.
//---------------------------------------------------class Graph
{
protected: int N;
public: void output_N(){cout<<N;}
int return_N(){return N;}
virtual void input_graph() = 0;
virtual void output_graph() = 0;
virtual void rand_graph() = 0;
Graph(int n1){N=n1;}
};
//---------------------------------------------------class Matr : public Graph
{
protected: bool **matr;

8. Программирование задач на графах повышенной сложности
96
public: void input_graph();
void output_graph();
void rand_graph();
Matr(int n1);
~Matr();
};
//-------------------------------------------------class Task : public Matr
{
public: Task(int n1) : Matr(n1){};
void task1();
void task2();
void Run();
};
void Task::Run()
{
textcolor(BLACK);
textbackground(WHITE);
clrscr();
rand_graph();
output_graph();
task1();
rand_graph();
output_graph();
task2();
}
//---------------------------------------------------int main()
{
Task t1 (8);
t1.Run();
getch();
return 0;
}

8.4. Структура главной функции в ООП
97
Для того чтобы убедиться, что программа работает, в конструктор
класса Task передадим количества вершин графа не 6, а 8. Результат работы программы показан на рис. 31.
Рис. 31. Результат работы программы при N=8

98
ЗАКЛЮЧЕНИЕ
Разработанная в пособии иерархия классов является достаточно
простой. Тем не менее, она может использоваться для программирования
задач на графах повышенной сложности (прил. 1). Для этого необходимо
доработать иерархию классов и дополнить классы новыми простыми операциями на графах, а затем создать новый класс Task, производный от
класса List или Matr в зависимости от способа задания графа. В этом
классе следует определить новую функцию для решения выбранной задачи
на графах повышенной сложности. Практически любая задача на графах
может быть решена с использованием рассмотренного набора простых
операций на графах. Поэтому для решения выбранной задачи повышенной
сложности можете использовать функции-операции ваших классов.
Кроме того, разработанная простая иерархия классов может быть основой для создания более сложных иерархий классов для решения задач на
графах. Например, ввести матрицу смежности можно не только с клавиатуры, но и «нарисовав» граф на экране дисплея. Кроме того, можно получить
случайный граф или ввести матрицу смежности из файла. При этом графическое изображение можно получить, «рисуя» вершины графа в любом месте экрана или автоматически размещая их по длине окружности. Таким
образом, можно продолжить построение иерархии классов на основе классификации по другому признаку – по способу ввода графа.

99
СПИСОК ЛИТЕРАТУРЫ
1. Оре, О. Теория графов [Текст] / О. Оре. – М. : Наука, 1980. – 236 с.
2. Рейнгольд, Э. Комбинаторные алгоритмы. Теория и практика [Текст] /
Э. Рейнгольд, Ю. Нивергельд, Н. Део. – М. : Мир, 1980.
3. Кристофидес, К. Теория графов. Алгоритмический подход [Текст] /
К. Кристофидес. – М. : Мир, 1978. – 432 с.
4. Басакер, Р. Конечные графы и сети [Текст] / Т. Саати. – М. : Наука,
1974. – 308 с.
5. Гладков, Л. А. Специальные разделы теории графов : учебное пособие
[Текст] / Л. А. Гладков, Н. В. Гладкова, В. В. Курейчик, В. М. Курейчик. – Ростов-на-Дону ; Таганрог : Издательство Южного федерального университа, 2018. – 111 с.
6. Лаффоре, Р. Объектно-ориентированное программирование в С++.
Классика Computer Science [Текст] / P. Лаффоре. 4-е изд. – СанктПетербург : Питер, 2003. – 928 с.
7. Кирнос, В. Н. Информатика II. Основы алгоритмизации и программиро-
вания на языке C++ [Текст] / В. Н. Кирнос. – Томск : Эль Контент,
2013. – 160 с.
8. Литвиненко, В. А. Программирование на С++ задач на графах : учебное
пособие [Текст] / В. А. Литвиненко. – Ростов-на-Дону ; Таганрог : Издательство Южного федерального университа, 2016. – 83 с.
9. Касьянов, В. Н. Графы в программировании: обработка, визуализация и
применение [Текст] / В. Н. Касьянов, В. А. Евстигнеев. – СПб. : БВХПетербург, 2003. – 1104 с.
10. Сик, Дж. С++ Boost Graph Library. Библиотека программиста [Текст] /
Дж. Сик, Л. Ли, Э. Ламсдэйн; пер. с английского Сузи Р. – СПб. : Питер,
2006. – 304 с.

100
ПРИЛОЖЕНИЯ
Приложение 1
Задачи на графах повышенной сложности
1. Перечислить все пути в графе длиной 2.
2. Определить путь между двумя заданными вершинами графа.
3. Перечислить все максимальные полные подграфы графа.
4. Определить максимальное паросочетание графа.
5. Определить в графе гамильтонов цикл.
6. Найти кратчайший путь между двумя заданными вершинами графа.
7. Определить наибольший полный подграф, в который входит заданная
вершина графа.
8. Определить наибольшее максимальное внутренне устойчивое множе-
ство графа.
9. Определить наибольшую клику графа.
10. Определить внешне устойчивое множество графа.
11. Определить является ли граф планарным.
12. Определить наибольшее максимальное паросочетание графа.
13. Определить совершенное максимальное паросочетание графа.
14. Определить максимальные полные подграфы, покрывающие все вер-
шины графа.
15. Определить максимальные полные подграфы, покрывающие все ребра
графа.
16. Построить дерево, покрывающее все вершины графа.
17. Определить кратчайшее дерево Прима.
18. Построить дерево Штейнера.
19. Построить граф, являющийся объединением двух графов.
20. Построить граф, являющийся пересечением двух графов.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
