Uploaded by Abubakr sq

Паросочетания и двудольные графы. Алгоритмы нахождения наибольшего и максимального паросочетания

advertisement
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное
учреждение высшего образования
Кубанский государственный технологический университет
(ФГБОУ ВО «КубГТУ»
Институт компьютерных систем и информационной безопасности
Кафедра информационных систем и программирования.
ПОЯСНИТЕЛЬНАЯ ЗАПИСКА
к курсовой работе
По дисциплине Дискретная математика
На тему ” Паросочетания и двудольные графы. Алгоритмы нахождения
наибольшего и максимального паросочетания ”.
Выполнил студент группы 17 – КБ – ПИ1 Савич Ростислав Алексеевич
Допущен к защите:
Руководитель работы__________________________д.ф.-м.н. В. М. Трофимов
(подпись, дата, расшифровка подписи)
Защищен____________________.
Оценка_________________________
(дата)
Члены комиссии____________________________________________________
(подпись, дата, расшифровка подписи)
_____________________________________________________________________________
(подпись, дата, расшифровка подписи)
Краснодар
2018
1
Министерство образования и науки Российской Федерации
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
«Кубанский государственный технологический университет»
(ФГБОУ ВПО «КубГТУ»)
Институт компьютерных систем и информационной безопасности
Кафедра информационных систем и программирования
УТВЕРЖДАЮ
Зав. Кафедрой ИСП,
к. т. н., доцент М.В. Янаева
«
»
2018г.
(подпись, дата)
ЗАДАНИЕ
на курсовую работу
Студенту Савичу Ростиславу Алексеевичу группы 17 – КБ – ПИ1 2 курса
ИКСиИБ
Направления 09.03.03 – Прикладная информатика
Тема работы ”Паросочетания и двудольные графы. Алгоритмы нахождения
наибольшего и максимального паросочетания”.
Объем работы:
а) пояснительная записка к работе
с.;
б) рекомендуемая литература: Программирование в алгоритмах / С. М.
Окулов. — М.: БИНОМ. Лаборатория знаний, 2002. — 341 с
Срок выполнения работы: с «4» сентября 2018 г. по « » декабря 2018 г.
Срок защиты:
« » декабря 2018 г.
Дата выдачи задания:
«4» сентября 2018 г.
Дата сдачи проекта на кафедру:
« » декабря 2018 г.
Руководитель работы
Задание принял студент
д.ф.-м.н. В.М. Трофимов
(подпись, Ф.И.О., звание, степень)
(подпись)
2
Р.А.Савич.
Реферат
Пояснительная записка к данной курсовой работе содержит: 17
страниц, 3 изображения, 4 источника.
VISUAL STUDIO 2017, C++, ПРОГРАММА, ДВУДОЛЬНЫЙ ГРАФ,
ПАРОСОЧЕТАНИЕ, АЛГОРИТМ КУНА.
Объектом
исследования
данной
курсовой
работы
является
двудольный граф.
Цель работы состоит в разработке программы для нахождения
наибольшего и максимального паросочетания в двудольном графе.
К полученным результатам относится реализованная и корректно
функционирующая программа.
3
Оглавление
Реферат ..................................................................................................................... 3
Введение ................................................................................................................... 5
1
Постановка задачи ............................................................................................ 6
2
Графы ................................................................................................................. 7
3
Паросочетания ................................................................................................... 9
4
Описание программы ..................................................................................... 11
5
Результат работы программы ........................................................................ 12
Заключение ............................................................................................................ 13
Список использованных источников .................................................................. 14
Приложение А ....................................................................................................... 15
Приложение Б ........................................................................................................ 17
4
Введение
В данной курсовой работе по дисциплине «Дискретная математика»
будет рассмотрена тема паросочетаний в двудольных графах и разработана
программа для нахождения наибольшего и максимального паросочетания.
Данная тема работы актуальна, поскольку графы широко используются в
решении задач математики и информатики. В частности, алгоритмы
нахождения наибольшего паросочетания применяются для нахождения
максимального потока в компьютерных сетях.
5
1 Постановка задачи
Задачей данной курсовой работы является разработка программы для
нахождения наибольшего и максимального паросочетания в двудольном
графе.
6
2 Графы
Граф
—
это
абстрактный
математический
объект,
который
представляет собой множество вершин графа и набор рёбер, которые
соединяют вершины между собой. Например, за множество вершин можно
взять множество населенных пунктов, а в качестве рёбер представить дороги,
соединяющие эти пункты.
Исходя из разных областей применения виды графов могут
различаться направленностью, ограничениями на количество связей и
дополнительными данными о вершинах или рёбрах. Многие структуры,
представляющие практический интерес в математике и информатике, могут
быть представлены графами. Например, строение компьютерных сетей
можно смоделировать при помощи ориентированного графа, в котором
вершины — это компьютеры, а дуги (ориентированные рёбра) —
соединяющие их сети.
Графы являются основным объектом изучения теории графов.
Различают несколько видов графов.
Граф, или неориентированный граф G — это упорядоченная пара
G:=(V,E) G:=(V,E), где V — это непустое множество вершин или узлов, а E
— множество пар (в случае неориентированного графа — неупорядоченных)
вершин, называемых рёбрами.
Ориентированный граф (сокращённо орграф) G — это упорядоченная
пара G:=(V,A), где V — непустое множество вершин или узлов, и A —
множество
(упорядоченных)
пар
различных
вершин,
называемых
ориентированными рёбрами (дугами).
Смешанный граф G — это граф, в котором некоторые рёбра могут
быть
ориентированными,
а
некоторые
—
неориентированными.
Записывается упорядоченной тройкой G:=(V,E,A), где V, E и A определены
так же, как выше.
Ориентированный и неориентированный графы являются частными
случаями смешанного.
7
Двудольный граф или биграф – это граф, множество вершин которого
можно разбить на две части таким образом, что каждое ребро графа
соединяет какую-то вершину из одной части с какой-то вершиной другой
части, то есть не существует ребра, соединяющего две вершины из одной и
той же части.
В данной курсовой работе будет рассмотрен двудольный граф.
8
3
Паросочетания
Паросочетанием в теории графов называют множество попарно
несмежных рёбер, то есть рёбер, не имеющих общих вершин.
Выделяют несколько видов паросочетаний.
Максимальное паросочетание — это такое паросочетание M в графе
G, которое не содержится ни в каком другом паросочетании этого графа, то
есть к нему невозможно добавить ни одно ребро, которое бы являлось
несмежным ко всем рёбрам паросочетания. Другими словами, паросочетание
M графа G является максимальным, если любое ребро в G имеет непустое
пересечение, по крайней мере, с одним ребром из M.
Наибольшее
паросочетание
(или
максимальное
по
размеру
паросочетание)— это такое паросочетание, которое содержит максимальное
количество
рёбер.
У
графа
может
быть
множество
наибольших
паросочетаний. При этом любое наибольшее паросочетание является
максимальным, но не любое максимальное будет наибольшим.
Совершенным паросочетанием называется паросочетание, в котором
участвуют все вершины графа. То есть любая вершина графа инцидентна
ровно одному ребру, входящему в паросочетание. Почти совершенным
паросочетанием называется паросочетание, в котором не участвует ровно
одна вершина. Это может произойти, если граф имеет нечётное число
вершин.
Для нахождения наибольшего паросочетания можно использовать
алгоритм Куна. Этот алгоритм можно описать так: сначала возьмём пустое
паросочетание, а потом — пока в графе удаётся найти увеличивающую цепь,
— будем выполнять чередование паросочетания вдоль этой цепи, и
повторять процесс поиска увеличивающей цепи. Как только такую цепь
найти не удалось — процесс останавливаем, — текущее паросочетание и есть
максимальное.
9
На рисунке 1 представлен рассматриваемый двудольный граф.
Красным выделены ребра, входящие в наибольшее паросочетание, которое
равно 5.
Рисунок 1 Двудольный граф.
10
4 Описание программы
Программа для данной курсовой работы была разработана на языке
программирования С++ в среде разработки Visual Studio 2017
Работа с вводом и выводом данных осуществляется через методы cin
и cout.
Граф был реализован с помощью матрицы смежности.
int Adj[6][6] = {
{1,0,0,0,0,0},
{0,1,1,1,0,0},
{0,0,0,0,1,1},
{0,0,0,0,0,1},
{0,0,0,1,0,0},
{0,0,0,1,0,0} };
Алгоритм Куна.
bool kuhn(int v) {
if (used[v]) return false; used[v] = true;
for (size_t i = 0; i < g[v].size(); ++i) {
int to = g[v][i];
if (mt[to] == -1 || kuhn(mt[to]))
{
mt[to] = v;
return true;
}
}
return false;
}
С помощью setlocale была реализована возможность вывода символов
русского алфавита в консоль.
setlocale(LC_CTYPE, "rus");
Для работы с циклами был использован оператор for.
11
5
Результат работы программы
После написания кода программы, она была запущена для проверки.
Были получены следующие результаты.
12
Заключение
В ходе выполнения данной курсовой работы по дисциплине
«Дискретная математика» была рассмотрена тема графов и паросочетаний, а
также разработана программа для нахождения наибольшего паросочетания в
двудольном графе по алгоритму Куна.
Программа
работает
без
ошибок.
Код
написан
максимально
компактно и интерфейс удобен для использования.
Полученные знания можно применять в дальнейшей деятельности.
13
Список использованных источников
1)
П. Т.А, C/C++. Программирование на языке высокого уровня,
Санкт-Петербург, 2003, p. 461.
2)
www.cyberforum.ru/
3)
Роберт Седжвик. Алгоритмы на графах = Graph algorithms. — 3-е
изд. — Россия, Санкт-Петербург: «ДиаСофтЮП», 2002. — С. 496
4)
Окулов С.М. Программирование в алгоритмах /С.М. Окулов. –
М.: БИНОМ. Лаборатория знаний , 2002.- 341 с.
14
Листинг программы
Приложение А
#include "pch.h"
#include <vector>
#include <iostream>
#include <clocale>
using namespace std;
int n, k;
int p = 0;
vector < vector<int> > g;
vector<int> mt;
vector<char> used;
bool kuhn(int v) {
if (used[v]) return false; used[v] = true;
for (size_t i = 0; i < g[v].size(); ++i) {
int to = g[v][i];
if (mt[to] == -1 || kuhn(mt[to]))
{
mt[to] = v;
return true;
}
}
return false;
}
int main()
{
setlocale(LC_CTYPE, "rus");
n = k = 6;
int Adj[6][6] = {
{1,0,0,0,0,0},
{0,1,1,1,0,0},
{0,0,0,0,1,1},
{0,0,0,0,0,1},
{0,0,0,1,0,0},
{0,0,0,1,0,0} };
for (int i = 0; i < n; i++)
{
g.push_back(vector<int>());
for (int j = 0; j < n; j++)
{
g[i].push_back(0);
g[i][j] = Adj[i][j];
}
}
mt.assign(k, -1);
for (int i = 0; i < n; ++i) {
used.assign(n, false);
kuhn(i);
p++;
}
for (int i = 0; i < k; ++i) if (mt[i] != -1)
15
printf("%d %d\n", mt[i] + 1, i + 1);
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
{
cout << Adj[i][j] << " ";
}
cout << endl;
}
cout << "Наибольшее паросочетание: " << p << endl;
}
16
Приложение Б
17
Download