Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основы объектно-ориентированного программирования задач на графах. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
1 Мб
Скачать
☆
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. Построить граф, являющийся пересечением двух графов.
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]